动态按钮命令事件不会触发

时间:2012-03-05 09:20:44

标签: c# asp.net listview user-controls

实际上,我正在使用asp.net和c#开发动态模板 我有一个主要的aspx页面,在这个页面里面我有一个usercontrol页面。在我的usercontrol中,我应该从XML文件中获取数据,然后在listview中动态创建一个表,每行包括最后一列的编辑和删除按钮,如下图所示。

enter image description here

我在ItemDataBound函数中创建了表格,如下所示:

protected void lv_Uc_Module_ItemDataBound(object sender, ListViewItemEventArgs e)
{  
    if (e.Item.ItemType == ListViewItemType.DataItem && hid_SaveClicked.Value != "1")
    {
        XmlDocument xDocRead = new XmlDocument();
        xDocRead.Load(Server.MapPath("ModuleTemp.xml"));
        string xModuleName = hid_ChooseModule.Value;
        XmlNode xColCounter;
        TableRow tr_DataBound = new TableRow();
        TableRow tr_Lv_Header = new TableRow();

        if (!"".Equals(hid_ChooseModule.Value))
        {
            xColCounter = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/List");
        }
        else
        {
            xModuleName = xDocRead.SelectSingleNode("ModuleTemp").FirstChild.Name;
            xColCounter = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/List");
        }
        int pkCounter = 0, nonPkCounter = 0, colCount = xColCounter.ChildNodes.Count;
        string[] primaryKey = new string[30];
        string[] nonPrimaryKey = new string[colCount + 1];

        for (int i = 1; i <= colCount; i++)
        {
            if (xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Edit/TableColumn" + i).Attributes.GetNamedItem("IsPrimaryKey").Value == "Y")
            {
                primaryKey[pkCounter] = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Edit/TableColumn" + i).Attributes.GetNamedItem("Name").Value;
                pkCounter++;
            }
            else
            {
                nonPrimaryKey[nonPkCounter] = xDocRead.SelectSingleNode("ModuleTemp/" + xModuleName + "/Edit/TableColumn" + i).Attributes.GetNamedItem("Name").Value;
                nonPkCounter++;
            }
        }

        System.Data.DataRowView rowView = e.Item.DataItem as System.Data.DataRowView;

        for (int i = 0; i < pkCounter + nonPkCounter; i++)
        { 
            dataBoundTemp[rowCounter, i] = rowView[i].ToString();
        }
        rowCounter++;

        TableCell tc_Lv_Header = new TableCell();
        if (!"".Equals(hid_ChooseModule.Value))
        {
            if (tempHeader == 0)
            {
                tempHeader++;
                for (int i = 1; i <= pkCounter + nonPkCounter; i++)
                {
                    tc_Lv_Header = new TableCell();
                    Label lb = new Label();

                    if (i <= pkCounter)
                    {
                        lb.Text = primaryKey[i - 1];
                    }
                    else
                    {
                        lb.Text = nonPrimaryKey[i - pkCounter - 1];
                    }

                    lb.ID = "lb" + i + "_Table_IphContainer";
                    tc_Lv_Header.Controls.Add(lb);
                    tc_Lv_Header.CssClass = "th_ItemTemplate";
                    tr_Lv_Header.Cells.Add(tc_Lv_Header);
                }

                tr_Lv_Header.Cells.Add(tc_Lv_Header);

                table_Header.Rows.Add(tr_Lv_Header);
                PlaceHolder th_Ph_Lv_Hedear = (PlaceHolder)lv_Uc_Module.FindControl("th_Ph_Lv_header");
                th_Ph_Lv_Hedear.Controls.Add(table_Header);
            }
        }
        TableCell tc_DataBound = new TableCell();

        if (editTempSelection == e.Item.DataItemIndex)
        {
            for (int i = 1; i <= pkCounter + nonPkCounter; i++)
            {
                //tc_DataBound = new TableCell();
                tc_DataBound = new TableCell();
                TextBox tb = new TextBox();
                //(TextBox)e.Item.FindControl("td_EditTemp" + i);
                tb.Width = 110;
                tb.Text = rowView[i - 1].ToString();
                tb.ID = "td_EditTemp" + i + "_" + e.Item.DataItemIndex;
                tc_DataBound.Controls.Add(tb);
                tc_DataBound.CssClass = "td_Tb_ItemTemplate";
                tr_DataBound.Cells.Add(tc_DataBound);
            }
        }
        else
        {
            for (int i = 1; i <= pkCounter + nonPkCounter; i++)
            {
                tc_DataBound = new TableCell();
                Label lb = new Label();
                //(Label)e.Item.FindControl("lb_ItemTemp" + i);
                lb.Text = rowView[i - 1].ToString();
                lb.ID = "lb_ItemTemp" + i + "_" + e.Item.DataItemIndex;
                tc_DataBound.Controls.Add(lb);
                tc_DataBound.CssClass = "td_Lb_ItemTemplate";
                tr_DataBound.Cells.Add(tc_DataBound);
            }
        }
        // add button to the columns
        if (editTempSelection != e.Item.DataItemIndex)
        {
            tc_DataBound = new TableCell();
            Button btn_Edit = new Button();
            btn_Edit.ID = "btn_Edit";
            btn_Edit.CommandName = "Edit";
            btn_Edit.CssClass = "btn_Edit";
            //btn_Edit.CausesValidation = true;
            tc_DataBound.Controls.Add(btn_Edit);
            tr_DataBound.Cells.Add(tc_DataBound);

            tc_DataBound = new TableCell();
            Button btn_Delete = new Button();
            btn_Delete.ID = "btn_Delete";
            btn_Delete.CommandName = "Delete";
            btn_Delete.CssClass = "btn_Delete";
            btn_Delete.CausesValidation = false;
            btn_Delete.OnClientClick = "return confirm('Are you sure you want to delete this item?');";
            //btn_Delete.Command += new CommandEventHandler(lv_Uc_Module_ItemDeleting);
            //btn_Delete.CommandName = e.Item.DataItemIndex.ToString();
            tc_DataBound.Controls.Add(btn_Delete);
            tr_DataBound.Cells.Add(tc_DataBound);
        }
        else
        {
            tc_DataBound = new TableCell();
            Button btn_Update = new Button();
            btn_Update.ID = "btn_Update";
            //btn_Update.CommandName = "Update";
            btn_Update.CssClass = "btn_Update";
            //btn_Update.ValidationGroup = "VGEditTmp";
            //btn_Update.OnClientClick = "alert('hi');";
            btn_Update.Command += new CommandEventHandler(lv_Uc_Module_ItemUpdating);
            btn_Update.CommandName = e.Item.DataItemIndex.ToString();
            tc_DataBound.Controls.Add(btn_Update);
            tr_DataBound.Cells.Add(tc_DataBound);
            hid_SaveClicked.Value = "1";

            tc_DataBound = new TableCell();
            Button btn_Cancel = new Button();
            btn_Cancel.ID = "btn_Cancel";
            btn_Cancel.CommandName = "Cancel";
            btn_Cancel.CssClass = "btn_Cancel";
            btn_Cancel.CausesValidation = false;
            tc_DataBound.Controls.Add(btn_Cancel);
            tr_DataBound.Cells.Add(tc_DataBound);
            tr_DataBound.CssClass = "tr_Edit_ItemTemplate";
        }

        // add columns to the row
        tr_DataBound.Cells.Add(tc_DataBound);
        table_Lv_ItemTemplate = (Table)e.Item.FindControl("Table_Lv_ItemTemplate");
        table_Lv_ItemTemplate.Rows.Add(tr_DataBound);
        //"lb_ItemTemp" + i + "_" + e.Item.DataItemIndex;     "lb_ItemTemp" + rowCounter + "_" + e.Item.DataItemIndex
    }
}

当用户点击编辑按钮时,它必须将所选行的标签更改为文本框,如下图所示:

enter image description here

我的列表视图代码如下:

<asp:ListView ID="lv_Uc_Module" runat="server"
                    OnItemEditing="lv_Uc_Module_ItemEditing" 
                    OnItemDeleting="lv_Uc_Module_ItemDeleting"
                    OnItemCanceling="lv_Uc_Module_ItemCanceling" 
                    OnItemDataBound="lv_Uc_Module_ItemDataBound"
                    OnSorting="lv_Uc_Module_Sorting">

                        <LayoutTemplate>
                            <asp:Table runat="server" ID="table_Lv_Layout">
                                <asp:TableRow runat="server" ID="tr_Table_Layout">
                                    <asp:TableCell runat="server" ID="td_Table_Layout">
                                        <asp:Table runat="server" ID="itemPlaceholderContainer">
                                            <asp:TableRow runat="server" ID="tr_Table_IphContainer">

                                                <asp:TableHeaderCell runat="server">
                                                    <asp:PlaceHolder ID="th_Ph_Lv_header" runat="server"></asp:PlaceHolder>
                                                </asp:TableHeaderCell>
                                            </asp:TableRow>
                                            <asp:TableRow runat="server">
                                                <asp:TableCell runat="server">

                                                    <asp:PlaceHolder runat="server" ID="itemPlaceholder" />

                                                </asp:TableCell>

                                            </asp:TableRow>
                                        </asp:Table>
                                    </asp:TableCell>
                                </asp:TableRow>
                                <asp:TableRow runat="server" ID="tr_Validate_Table_Layout">
                                    <asp:TableCell runat="server" ID="td_Validate_Table_Layout" HorizontalAlign="Center" BackColor="#CCCCCC">
                                        <asp:ValidationSummary ID="ValidationSummary1" runat="server" HeaderText="You received the following errors:" ShowMessageBox="true" ShowSummary="false" ValidationGroup="VGEditTmp" />
                                        <%--<asp:ValidationSummary ID="ValidationSummary2" runat="server" HeaderText="You received the following errors:" ShowMessageBox="true" ShowSummary="false" ValidationGroup="VGInsertTmp" />--%>
                                    </asp:TableCell>
                                </asp:TableRow>
                            </asp:Table>
                            <br />
                            <asp:DataPager ID="lv_DataPager" runat="server" PagedControlID="lv_Uc_Module" PageSize="25" OnPreRender="lv_DataPager_PreRender">
                                <Fields>
                                    <asp:NextPreviousPagerField ButtonType="Image" ShowFirstPageButton="true" ShowLastPageButton="true" FirstPageImageUrl="~/Images/First.png" LastPageImageUrl="~/Images/Last.png" NextPageImageUrl="~/Images/Next.png" PreviousPageImageUrl="~/Images/Previous.png" />
                                    <asp:TemplatePagerField>
                                        <PagerTemplate>
                                            <span style="color:Blue;">
                                            </span>
                                        </PagerTemplate>
                                    </asp:TemplatePagerField>
                                </Fields>
                            </asp:DataPager>
                        </LayoutTemplate>

                        <ItemTemplate>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">

                                    <asp:Table runat="server" ID="Table_Lv_ItemTemplate"></asp:Table>

                                </asp:TableCell>
                                <asp:TableCell runat="server">
                                    <asp:Button ID="btn_Edit" runat="server" CommandName="Edit" Text="" CssClass="btn_Edit" CausesValidation="True" Visible="false" />
                                    <asp:Button ID="btn_Delete" runat="server" CommandName="Delete" Text="" CssClass="btn_Delete" CausesValidation="false" OnClientClick="return confirm('Are you sure you want to delete this item?');" Visible="false" />
                                </asp:TableCell>
                            </asp:TableRow>
                        </ItemTemplate>

问题是,一旦用户点击保存按钮将已编辑项目的更改保存到数据库,它就永远不会执行ItemUpdating功能。我在ItemDataBound函数下面放了代码来调用ItemUpdating函数。

 btn_Update.Command += new CommandEventHandler(lv_Uc_Module_ItemUpdating);
 btn_Update.CommandName = e.Item.DataItemIndex.ToString();

请指导我如何完成它。 我感谢你的考虑。

1 个答案:

答案 0 :(得分:4)

为了评估回发事件,控件必须出现在页面上。因此,您需要在事件执行之前使用动态按钮重新生成列表。

请参阅http://msdn.microsoft.com/en-us/library/ms178472.aspx

Page_init将是一个很好的地方。否则页面找不到触发事件的控件。

protected void Page_Init(object sender, EventArgs e)
{
  if (Page.IsPostback)
  {
    //bind your list so the buttons gets generated
  }
}

还要查看“为什么动态控件会在回发时消失而不会引发事件”http://forums.asp.net/t/1186195.aspx/1