2011-07-31 24 views
2

最近、本当に質問がありました。あなたが私を助けることを願っています。動的に作成されたボタンに動的に作成されたボタンを追加するにはどうすればいいですか?

ユーザーがボタンをクリックした後にテーブルを作成したいとします。最初のセルの各行に、ボタンを追加します。残念ながら、テーブルボタンはイベントを起動できません。それをどうやって行うのか、私の間違いがどこにあるのか教えてください。私はthis articleを使って次のサンプルコードを作成しました。

<asp:PlaceHolder ID="placeHolderForTable" runat="server"> 

</asp:PlaceHolder> 
<asp:Button ID="btnCreateTbl" runat="server" Text="Create Table"/> 
<asp:Label ID="lblResult" runat="server" /> 

コード:

private struct ControlInfo 
{ 
    public string ID; 
    public string Type; 
    public int Border; 
    public HtmlTableRow[] TblRows; 
    public HtmlTableCell[] TblCells; 
    public int Width; 
    public int Height; 
} 


protected void Page_Load(object sender, EventArgs e) 
{ 
    btnCreateTbl.Click+=new EventHandler(BtnClick); 
    if (this.IsPostBack) this.RecreatePersistedControls(); 
}//end Page_Load 


//Call CreateControl for each persisted control 
private void RecreatePersistedControls() 
{ 
    ArrayList al = (ArrayList)this.Session["DynamicControls"]; 
    if (al != null) 
     foreach (ControlInfo ci in al) 
      this.CreateControl(ci); 
}//end RecreatePersisterdControls method 

//Create control specified by ControlInfo structure 
private Control CreateControl(ControlInfo ci) 
{ 
    Control ctl = null; 

    switch (ci.Type) 
    { 
     case "Button": 
      ctl = new Button(); 
      ctl.ID = ci.ID; 
      ((Button)ctl).Text = "Edit"; 
      ((Button)ctl).Click+=new EventHandler(this.DoNothing); 
      if (this.placeHolderForTable.FindControl("tblResult") != null) 
      { 
       for (int r = 0; r < ci.Height; r++) 
       { 
        if (this.placeHolderForTable.FindControl("tblResult").FindControl("tr" + (r + 1)) != null && (r+1).ToString()==ci.ID[7].ToString()) 
         if (this.placeHolderForTable.FindControl("tblResult").FindControl("tr" + (r + 1)).FindControl("td" + (r + 1) + "1") != null) 
          if(this.placeHolderForTable.FindControl("tblResult").FindControl("tr" + (r + 1)).FindControl("td" + (r + 1) + "1").FindControl(ctl.ID)==null) 
           this.placeHolderForTable.FindControl("tblResult").FindControl("tr" + (r + 1)).FindControl("td" + (r + 1) + "1").Controls.Add(ctl); 
       } 
      } 
      break; 
     case "HtmlTable": 
      ctl = new HtmlTable(); 
      ctl.ID = ci.ID; 
      ((HtmlTable)ctl).Border = ci.Border; 

      for (int r = 0; r < ci.Height; r++) 
      { 
       HtmlTableRow row = ci.TblRows[r]; 
       row.ID = "tr" + (r + 1); 
       for (int c = r * ci.Width; c < r * ci.Width+2; c++) 
       { 
        ci.TblCells[c].ID="td"+(r+1)+(c%2+1); 
        row.Cells.Add(ci.TblCells[c]); 

       } 
       ((HtmlTable)ctl).Rows.Add(row); 
      } 
      if(this.placeHolderForTable.FindControl(ctl.ID)==null) 
       this.placeHolderForTable.Controls.Add(ctl); 
      break; 
     default: 
      return null; 
    } 
    return ctl; 
}//end CreateControl method 

//Create ControlInfo structure and persist it to Session 
private ControlInfo PersistControl(string id, string type, int border, HtmlTableRow[] tblRows, HtmlTableCell[] tblCells, int width, 
    int height) 
{ 
    ControlInfo ci = new ControlInfo(); 
    ci.ID = id; 
    ci.Type = type; 
    ci.Border = border; 
    ci.TblRows = tblRows; 
    ci.TblCells = tblCells; 
    ci.Width = width; 
    ci.Height = height; 

    ArrayList al = (ArrayList)this.Session["DynamicControls"]; 
    if (al == null) al = new ArrayList(); 
    al.Add(ci); 
    this.Session["DynamicControls"] = al; 
    return ci; 
}//end PersistControl method 

private void BtnClick(object sender, EventArgs e) 
{ 
    int cellIx=0,rowIx=0;    
    HtmlTableRow tr1 = new HtmlTableRow(); 
    HtmlTableCell td11 = new HtmlTableCell(); 
    tr1.Cells.Add(td11); 
    HtmlTableCell td12 = new HtmlTableCell(); 
    td12.InnerText = "td12"; 
    tr1.Cells.Add(td12); 
    HtmlTableRow tr2 = new HtmlTableRow(); 
    HtmlTableCell td21 = new HtmlTableCell(); 
    tr2.Cells.Add(td21); 
    HtmlTableCell td22 = new HtmlTableCell(); 
    tr2.Cells.Add(td22); 
    td22.InnerText = "td22"; 
    HtmlTableRow []arrRows=new HtmlTableRow[2]; 
    arrRows[rowIx++]=tr1; 
    arrRows[rowIx++]=tr2; 
    HtmlTableCell []arrCells=new HtmlTableCell[4]; 
    arrCells[cellIx++]=td11; 
    arrCells[cellIx++]=td12; 
    arrCells[cellIx++]=td21; 
    arrCells[cellIx++]=td22; 
    ControlInfo ci = PersistControl("tblResult", "HtmlTable", 3, arrRows, arrCells, 2, 2); 
    HtmlTable tblResult = (HtmlTable)CreateControl(ci); 

    ci = PersistControl("btnEdit1", "Button", 0, arrRows, arrCells, 2, 2); 
    Button btnEdit1 = (Button)CreateControl(ci); 

    ci = PersistControl("btnEdit2", "Button", 0, arrRows, arrCells, 2, 2); 
    Button btnEdit2 = (Button)CreateControl(ci); 
} 

public void DoNothing(object sender, EventArgs e) 
{ 
    lblResult.Text = (sender as HtmlButton).ID + " done"; 
} 
+0

これは特に建設的なコメントではありませんが、マイクロソフトがASPを導入するのが正しい理由の例として、この投稿を使用します。 NET MVC(なぜWebFormsが存在してはならないのか) –

+0

お望み通りにしてください。 – Pepe

答えて

0

ダイナミックコントロールは全体他の獣であり、私はできるだけ彼らから離れて滞在してみてください。それが必要であるかもしれないと言われている。

イベントハンドラと動的コントロールについての事は、あなたがそうでなければ、彼らは私が作った不思議なhttp://support.microsoft.com/?id=317794

を振る舞うことができるまでの配線とのOnInitまたはPage_Loadの機能のページコントロールツリーにコントロールを追加することを確認する必要がPage_Loadでイベントハンドラを配線するコードを編集します。以下を参照して質問がある場合はお知らせください:

// Added a ViewState persisted prop 
    bool WireUpControls 
    { 
     get 
     { 
      return ViewState["wireUpControls"] != null ? Convert.ToBoolean(ViewState["wireUpControls"]) : false; 
     } 
     set 
     { 
      ViewState["wireUpControls"] = value; 
     } 
    } 

    void CreateControlTable() 
    { 
     int cellIx = 0, rowIx = 0; 
     HtmlTableRow tr1 = new HtmlTableRow(); 
     HtmlTableCell td11 = new HtmlTableCell(); 
     tr1.Cells.Add(td11); 
     HtmlTableCell td12 = new HtmlTableCell(); 
     td12.InnerText = "td12"; 
     tr1.Cells.Add(td12); 
     HtmlTableRow tr2 = new HtmlTableRow(); 
     HtmlTableCell td21 = new HtmlTableCell(); 
     tr2.Cells.Add(td21); 
     HtmlTableCell td22 = new HtmlTableCell(); 
     tr2.Cells.Add(td22); 
     td22.InnerText = "td22"; 
     HtmlTableRow[] arrRows = new HtmlTableRow[2]; 
     arrRows[rowIx++] = tr1; 
     arrRows[rowIx++] = tr2; 
     HtmlTableCell[] arrCells = new HtmlTableCell[4]; 
     arrCells[cellIx++] = td11; 
     arrCells[cellIx++] = td12; 
     arrCells[cellIx++] = td21; 
     arrCells[cellIx++] = td22; 
     ControlInfo ci = PersistControl("tblResult", "HtmlTable", 3, arrRows, arrCells, 2, 2); 
     HtmlTable tblResult = (HtmlTable)CreateControl(ci); 

     ci = PersistControl("btnEdit1", "Button", 0, arrRows, arrCells, 2, 2); 
     Button btnEdit1 = (Button)CreateControl(ci); 

     ci = PersistControl("btnEdit2", "Button", 0, arrRows, arrCells, 2, 2); 
     Button btnEdit2 = (Button)CreateControl(ci); 
    } 

    // Call CreateControlTable() if we need to create the controls and wire up events 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     btnCreateTbl.Click += new EventHandler(BtnClick); 
     if (WireUpControls) CreateControlTable(); 
     //if (this.IsPostBack) this.RecreatePersistedControls(); 

    } 

    protected void BtnClick(object sender, EventArgs e) 
    { 
     WireUpControls = true; 
     CreateControlTable(); 
    } 

    public void DoNothing(object sender, EventArgs e) 
    { 
     lblResult.Text = (sender as Button).ID + " done"; 
    } 
+0

本当にありがとうございました。ただし、テーブル内のボタンはまだイベント「DoNothing」を起動しません。 – Pepe

+0

デバッグは、WireUpControlsが常に "false"を返すことを示します。 – Pepe

+0

Aha。 ViewState ["wireUpControls"]は、BtnClickイベント(テーブルの最初の作成時)でtrueに設定する必要があります。 – Pepe

関連する問題