【问题标题】:Prevent Visual Studio from adding child controls阻止 Visual Studio 添加子控件
【发布时间】:2011-10-28 18:07:29
【问题描述】:

我在这里遇到了一个奇怪的问题。我这样创建了一个自定义控件:

public class Textbox : System.Web.WebControls.Placeholder
{

    if( [certain criteria are met])
        this.Controls.Add(new System.Web.WebControls.Textbox());

}

在 Visual Studio 的设计器模式下工作时,每当我向页面添加一个文本框时:

<myControls:Textbox id="txtTest" runat="server" />

Visual Studio 习惯于将我的标记更改为以下内容:

<myControls:Textbox id="txtTest" runat="server" >
    <asp:Textbox runat="server" />
</myControls:Textbox>

这会更改最终的输出标记,以便出现两个文本框。有没有办法阻止 Visual Studio 这样做?

编辑: 根据要求,这是页面标记

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="TestApp.Test" %>
<%@ Register Assembly="MyControls.WebControls" Namespace="MyControls.WebControls" TagPrefix="myControls" %>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<table>
<tr>
    <td>
        <asp:Label ID="lblTest" runat="server">Test Label:</asp:Label> 
        <myControls:TextBox ID="txtTest" runat="server" Width="80px"></myControls:TextBox>
    </td>
</tr>
</table>
</asp:Content>

【问题讨论】:

  • 您的用户控件可能有问题。
  • 我不这么认为,VS正在编译页面并确定要添加文本框,所以它添加它,但是可能会出现不添加文本框的情况。
  • 发布用户控件的标记
  • 抱歉,不是用户控件。只是一页。不过,我会为此发布标记。
  • 看起来您正在扩展 PlaceHolder,但您的控件称为 TextBox。这是为什么呢?

标签: asp.net .net visual-studio-2010 custom-controls markup


【解决方案1】:

我认为这是因为您的类继承自 PlaceHolder 控件,该控件实现了 TemplateControl 类。我不知道这是否有原因,但是如果您改为从TextBox 控件继承似乎会更合适。

编辑

由于您使用逻辑来呈现多个控件之一,因此我将继承自 WebControl 类。这将允许您基本上渲染您想要的任何内容。尽管我必须承认,您尝试做的事情可能需要大量的工作。

【讨论】:

  • 呵呵,我只是在仔细查看了他的代码后将其发布为评论;)
  • @Icarus 继承自占位符的原因是因为可以在其中放置其他类型的控件。我们对文本框的想法是它与数据库中的记录相匹配。这些文本框本质上可以是文本框、组合框或建议框。这有一个深思熟虑的原因,但我不想创建太长的帖子。我可以解释它是否相关。
  • 即使继承自TextBox控件,仍然可以在render方法中添加其他控件。从TextBox 控件继承只是作为基线。例如,我这样做是为了在我的自定义文本框中包含验证器。
  • 是的,但是您可以添加替换原始控件的控件吗?如果我从文本框继承,我基本上需要能够说 this = new RadComboBox(); // [Telerik 控制]
  • 在这种情况下,您应该只继承 WebControl 类。 PlaceHolder 绝对不是要继承的控件。
【解决方案2】:

如果我正确理解了这个问题,那么您在设计时遇到了问题,而不是在运行时。

如果是这种情况,您应该使用测试包装您的控件添加代码,以确保它仅在您未处于设计模式时执行。例如:

    if ((!this.InDesignMode) && ( [certain criteria are met]))
    this.Controls.Add(new System.Web.WebControls.Textbox());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多