0

我在下面定义了一个非常简单的自定义控件:

public class TestCtrl : WebControl
{
    protected override void OnInit(EventArgs e)
    {
        var btn = new Button() { ID = "test", Text = "text"};
        this.Controls.Add(btn);
    }
}

但是,当我希望将它们的多个实例放在同一页面上时,我得到...

'找到了具有相同 ID'test' 的多个控件。

...单击时btn

    protected void Page_Init(object sender, EventArgs e)
    {
        var ctrl1 = new TestCtrl() { ID = "ctrl1" };
        plc.Controls.Add(ctrl1);
        var ctrl2 = new TestCtrl() { ID = "ctrl2" };
        plc.Controls.Add(ctrl2);
    }

有没有一种干净的方法来阻止这种情况发生?我尝试将 ClientIDMode 设置为“自动”但没有成功,因为name渲染标记的属性"test"在两个按钮上。

编辑:通过将“INamingContainer”添加到控件来解决 public class TestCtrl : WebControl, INamingContainer{...}

4

3 回答 3

2

编辑:通过将“INamingContainer”添加到控件公共类 TestCtrl 来解决:WebControl,INamingContainer{...}

于 2012-07-18T13:50:57.033 回答
0

你走错路了。

 public class TestCtrl : WebControl, INamingContainer {

     private button btn;

     [Bindable(true), Category("Content"), DefaultValue(""), Description("Gets or Sets the Fields that are to be added to the ListItems")]
     public string TextField {
        get { EnsureChildControls(); return btn.Text; } 
        set { EnsureChildControls(); btn.Text = value; }
     }

     [Bindable(true), Category("Content"), DefaultValue(""), Description("Gets or Sets another field of your choice")]
     public string SomeStringField{
        get { return ViewState["_someStringField"] != null ? ViewState["_someStringField"].ToString() : String.Empty ;  }
        set { ViewState["_someStringField"] = value; }
     }

     protected override void OnInit(EventArgs e) {
         base.OnInit(e);
     }

     protected override void CreateChildControls() {
         btn = new button();
         btn.id = "btn";

         this.Controls.Add(btn);
     }

     protected override void Render(HtmlTextWriter writer) {
         writer.Write(<b>SomeStringField + ":</b>");
         btn.RenderControl(writer);
     }

 }

将其添加到您的页面后

这将显示一个标签,然后是它旁边的按钮。您想要但 CreateChildControls 中的 id,以便为它分配一个唯一的 ID。EnsureChildControls 将确保正确加载属性。您可以从控件中的几乎任何位置调用此方法,但我会在 OnInit 之后执行此操作。如果不是,那么 Id 将被混淆。有时他们会工作,而其他人则不会。Jquery 的 Javascript 也会让你头疼。

我会参考微软的例子。他们有很多,非常有帮助。

http://msdn.microsoft.com/en-us/library/aa479016.aspx

于 2013-08-29T19:10:19.890 回答
0

因为您在 OnInit 方法中指定了 btn 的 ID 等于“test”,因此当您将控件添加到页面时,它为控件设置了 ID = test。我认为没有必要在 OnInit() 方法中设置 ID 属性。将以下代码添加到您的渲染方法

protected override void OnInit(EventArgs e)
{
    var btn = new Button() { Text = "text"}; // No need to add ID property
    this.Controls.Add(btn);
}
于 2012-07-18T12:26:10.480 回答