2011-12-09 3 views
1

ボタンとドロップダウンを含むC#サーバーコントロールを持っています ボタンをクリックしている間にドロップダウンselectedindexを応答したい場合は をクリックしてください。ページレベル(ASPX)のイベントハンドラを作成し、しかし、私は、コントロールの内部でそれをコーディングし、DLLとしてコンパイルしたいサーバーコントロールでドロップダウンとボタン、および独自のイベントをトリガー

私の流れは次のとおりです。 コントロールクラスがロード オーバーライドCreateChildControlsのは、追加することで、ボタンやドロップダウンを構築サーバーコントロールへのボタンをクリックしてクリックイベントをバインドします RenderControlをオーバーライドしてドロップダウンをテーブルに追加し、ボタンをレンダリングします

は最終的に私は、ボタンイベントをクリックすることができることを見出し、しかし、私はここに第二1

を選択すると、それだけで、ドロップダウン選択した項目を取得するカントコードです:

public class ServerControl1 : WebControl, INamingContainer 
    {  
      public ServerControl1() 
      { 
       _oBtn = new Button(); 
       _oBtn.ID = "btn"; 
       _oBtn.Text = "Click Me"; 
       _oBtn.Click += new EventHandler(_oBtn_Click); 
       _ddl = new DropDownList(); 
       _ddl.ID = "ddl"; 
       _ddl.Items.add(new ListItem("xxxxxxxx", "xxxxxxxx")) 
       _ddl.Items.add(new ListItem("yyyyyyy", "yyyyyyy")) 
      } 

      protected override void CreateChildControls() 
      { 
       this.Controls.Add(_oBtn); 
       base.CreateChildControls(); 
      } 

      public override void RenderControl(HtmlTextWriter writer) 
      { 
       AddAttributesToRender(writer); 
       Table m_oTable = new Table(); 
       TableRow m_oRow; 
       TableCell m_oCell; 
       m_oCell = new TableCell(); 
       m_oCell.Controls.Add(_ddl); 
       m_oRow.Cells.Add(m_oCell); 
       m_oTable.Rows.Add(m_oRow); 
       m_oTable.RenderControl(writer); 
       _oBtn.RenderControl(writer); 
      } 

      protected void _oBtn_Click(object sender, EventArgs e) 
      { 
       if (_ddl.SelectedIndex != 0) 
       { 
        Page.Response.Redirect(Url + "&f0=" + _ddl.SelectedIndex); 
       } 
       else 
       { 
        Page.Response.Write("nonononon"); 
       } 
      } 
    } 

答えて

1

するために、動的に追加されたコントロール(ボタン、ドロップダウンリスト)の状態(ViewState)を保持するには、それらがコントロールツリー階層に追加されていることを確認する必要があります。

-> Page 
    -> WebControl 
      -> Button 
      -> DropdownList 

WebControl内の子コントロールを初期化する適切な方法は、Initイベントです。コントロールのLoadイベント前より

/// <summary> 
    /// Initialization of controls 
    /// </summary> 
    /// <param name="e"></param> 
    protected override void OnInit(EventArgs e) 
    {   
     base.OnInit(e); 
     _oBtn = new Button(); 
     _ddl = new DropDownList();  
     m_oTable = new Table(); 
     m_oRow = new TableRow(); 
     m_oCell = new TableCell(); 

     _oBtn.ID = "btn"; 
     _oBtn.Text = "Click Me"; 
     _oBtn.Click += new EventHandler(_oBtn_Click); 


     _ddl.ID = "ddl";    
     _ddl.Items.Add(new ListItem("xxxxxxxx", "xxxxxxxx")); 
     _ddl.Items.Add(new ListItem("yyyyyyy", "yyyyyyy")); 
     _ddl.EnableViewState = true; 
     _ddl.AutoPostBack = false;   

    } 

IsPostaback場合、子コントロールの状態はViewStateは(例:現在のボタンのテキストと選択されたインデックスが設定されている)から復元されます。

次のステップは、CreateChildControls方法

protected override void CreateChildControls() 
     { 

      m_oCell.Controls.Add(_ddl); 
      m_oRow.Cells.Add(m_oCell); 
      m_oTable.Rows.Add(m_oRow); 
      this.Controls.Add(_oBtn);    
      this.Controls.Add(m_oTable); 
      base.CreateChildControls();   
     } 

にコントロールツリー階層で、この子コントロールを追加し、コントロールをレンダリングすることです。あなたはを回避する必要がありますこの時点でコントロールを初期化または追加するには:

public override void RenderControl(HtmlTextWriter writer) 
     { 
      m_oTable.RenderControl(writer); 
      _oBtn.RenderControl(writer); 
      _txt.RenderControl(writer); 

     } 
関連する問題