最近、本当に質問がありました。あなたが私を助けることを願っています。動的に作成されたボタンに動的に作成されたボタンを追加するにはどうすればいいですか?
ユーザーがボタンをクリックした後にテーブルを作成したいとします。最初のセルの各行に、ボタンを追加します。残念ながら、テーブルボタンはイベントを起動できません。それをどうやって行うのか、私の間違いがどこにあるのか教えてください。私は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";
}
これは特に建設的なコメントではありませんが、マイクロソフトがASPを導入するのが正しい理由の例として、この投稿を使用します。 NET MVC(なぜWebFormsが存在してはならないのか) –
お望み通りにしてください。 – Pepe