0

以下に定義されている非常に単純なカスタム コントロール ive があります。

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);
    }

これが起こらないようにするきれいな方法はありますか?nameレンダリングされたマークアップのプロパティが"test"両方のボタンにあるため、ClientIDMode を「Auto」に設定しようとしましたが、成功しませんでした。

編集:「INamingContainer」をコントロールに追加することで解決 public class TestCtrl : WebControl, INamingContainer{...}

4

3 に答える 3

2

編集:「INamingContainer」をコントロール パブリック クラス TestCtrl に追加することで解決: WebControl, INamingContainer{...}

于 2012-07-18T13:50:57.033 に答える
0

OnInit メソッドで btn の ID を "test" に指定したため、コントロールをページに追加すると、コントロールの ID = test が設定されます。OnInit() メソッドで ID プロパティを設定する必要はないと思います。render メソッドに次のコードを追加します。

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 に答える
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);
     }

 }

ページに追加した後

これにより、ラベルが表示され、その横にボタンが表示されます。一意の ID が割り当てられるように、CreateChildControls の ID を指定します。EnsureChildControls は、プロパティが正しく読み込まれることを確認します。このメソッドは、コントロールのどこからでも呼び出すことができますが、私は OnInit の後で呼び出します。そうでない場合、ID は混乱します。機能する場合もあれば、機能しない場合もあります。Jquery の Javascript も頭を悩ませます。

Microsoft の例を参照します。彼らはそれらの多くを持っており、非常に役に立ちます。

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

于 2013-08-29T19:10:19.890 に答える