0

我有一个页面,其中有一个 div,用户控件是通过代码使用用户控件的 LoadControl 动态添加的。

用户控件包含另一个用户控件(比如说 ChildUC)。ChildUC 包含一个具有插入和删除按钮的网格视图。

问题是,即使我单击这些按钮,click 事件也不会被触发,gridview 命令事件也不会被触发。该页面正在被回发,并在页面加载后退出,它不会触发任何其他事件。

到目前为止,我最近几天都在调试这个,但没有运气。

请帮帮我。提前致谢。

代码:

 <div id="dvMain" runat="server">
  </div>

   private void CreateHeaders()
    {

        foreach (Header hd in HeaderCollection)
        {
            List<Question> lstQuestion = QuestionCollection.FindAll(p => p.HID.Equals(hd.HeaderID));
            Sales_UserControls_Questions Question = null;
            if (lstQuestion.Count > 0)
            {
                Question = (Sales_UserControls_Questions)LoadControl("~/Sales/UserControls/Questions.ascx"); // This is the main user control that is being loaded dynamically
                Question.ID = "Question"+hd.HID;
                Question.lstQuestions = lstQuestion;
            }
            dvMain.Controls.Add(Header);
            if (HQQuestion != null)
                dvMain.Controls.Add(Question); // user control being added to div

        }
    }

    //Questions.ascx

<div>
    <asp:GridView ID="grdContent" runat="server" AutoGenerateColumns="False"
        OnRowDataBound="grdContent_RowDataBound" EnableTheming="False">
        <Columns>
            <asp:TemplateField ShowHeader="false">
                <ItemTemplate>
                    <asp:HiddenField ID="hdnQuestionID" runat="server" Value='<%# Eval("QID") %>' />
                    <asp:HiddenField ID="hdnQuestionType" runat="server" Value='<%# Eval("QTP") %>' />
                    <asp:Label ID="lblQuestionID" runat="server" EnableTheming="False" Text='<%# Eval("QID") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField>
                <HeaderTemplate>
                    <asp:Label ID="lblSHR" runat="server"></asp:Label>
                </HeaderTemplate>
                <ItemTemplate>
                    <asp:Label ID="lblText" runat="server" Text='<%# Eval("Text") %>'></asp:Label>
                    <div>
                        <asp:UpdatePanel ID="UpnlDGV" runat="server" UpdateMode="Conditional">
                            <ContentTemplate>
                                <DG:View ID="ucDGView" runat="server"></DG:View>
                           </ContentTemplate>
                        </asp:UpdatePanel>
                    </div>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</div>
//end of questions.ascx

//ucDGView.ascx
<div>
     <asp:GridView ID="grdDGView" runat="server"
                AutoGenerateColumns="False" OnRowDataBound="grdDGView_RowDataBound" OnRowDeleting="grdDGView_RowDeleting"
                OnRowCreated="grdDGView_RowCreated" HeaderStyle-Font-Bold="true" OnRowCommand="grdDGView_RowCommand">
                <Columns>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <dl id="dvNT" runat="server">
                                            <dt>
                                                <asp:Label ID="lblNT" runat="server" Text="NT:"></asp:Label>
                                            </dt>
                                            <dd>
                                                <asp:DropDownList ID="ddlNM" runat="server">
                                                </asp:DropDownList>
                                            </dd>
                                        </dl>
                                        <dl id="dvOSD" runat="server" class="grid_6 alpha MT10" visible="false">
                                            <dt>
                                                <asp:Label ID="lblOSDT" runat="server" Text="OSDT:"></asp:Label>
                                            </dt>
                                            <dd>
                                                <asp:TextBox ID="txtOSDT" runat="server" MaxLength="10" CssClass="maskDate"></asp:TextBox>
                                                <asp:CalendarExtender ID="txtOSDTE" runat="server" TargetControlID="txtOSDT"
                                                    Enabled="True" Format="MM/dd/yyyy">
                                                </asp:CalendarExtender>
                                            </dd>
                                        </dl>
                        </ItemTemplate>
                    </asp:TemplateField>
                     <asp:TemplateField>
                        <ItemTemplate>
                            <asp:ImageButton ID="imgBtnDelete" runat="server" ImageUrl="~/Sales/Common/Images/delete_red_mini.jpg"
                                CausesValidation="false" CssClass="cancel" CommandName="Delete" CommandArgument='<%#DataBinder.Eval(Container.DataItem, "OID")%>' />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:ImageButton ID="imgBtnAdd" runat="server" ImageUrl="~/Sales/Common/Images/PLUS_MINI.png"
                                CausesValidation="false" CssClass="cancel" CommandName="Add" CommandArgument='<%#DataBinder.Eval(Container.DataItem, "QID")%>' />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
    </asp:GridView>
</div>
//end of ucDGView.ascx
4

1 回答 1

0

您需要了解的是,它在asp.net 页面生命周期的哪个位置接收来自前端的事件。

触发回发的事件被发送回 asp.net 是一个隐藏的表单元素,称为事件目标。

这个输入在一个叫做ProcessPostData. 如果此时控件集合中不存在您的控件,则它无法接收该事件。所以你得到一个回发,但没有事件处理程序被触发。

这意味着,如果您希望事件处理程序触发,您必须在加载事件之前创建所有控件。您似乎必须根据某些用户输入来决定要加载哪些控件。用户输入在 上不可用Init。您可以覆盖该LoadViewState方法,并在那里处理您的用户输入。

页面生命周期

于 2012-08-06T19:51:21.807 回答