如何将动态创建的按钮添加到动态创建的表中?

时间:2011-07-31 19:36:25

标签: c# .net asp.net

最近一个问题一直困扰着我。我希望你能帮助我。

我想在用户点击按钮后创建一个表格。在第一个单元格的每一行,我想添加一个按钮。不幸的是,表格按钮无法触发事件。你能告诉我怎么做或我的错误在哪里吗?我使用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";
}

1 个答案:

答案 0 :(得分:0)

动态控制是另一种野兽,我尽可能地远离它们。话虽如此,但有些情况可能是必要的。

关于事件处理程序和动态控件的事情,您必须确保连接并将控件添加到OnInit或Page_Load函数中的页面控件树,否则它们会表现得很奇怪http://support.microsoft.com/?id=317794

我对您的代码进行了一些编辑,它们在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";
    }