【问题标题】:user control inside dynamic user control click event not firing?动态用户控件单击事件中的用户控件未触发?
【发布时间】:2012-08-07 03:51:21
【问题描述】:

我有一个页面,其中有一个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

【问题讨论】:

  • 很难确定,但如果它是回发而不是触发事件,请尝试将代码包装在 if(!IsPostBack) { your code } 通常我遇到过代码回发的情况当我想让它先做某事时,它就像是新加载的页面。
  • Brain 非常感谢您的回复,但它已经在回发中了。

标签: c#


【解决方案1】:

您需要了解的是,它在asp.net page life cycle 的哪个位置接收来自前端的事件。

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

此输入在称为ProcessPostData 的函数中进行处理。 如果此时控件集合中不存在您的控件,则它无法接收该事件。所以你得到一个回发,但没有触发任何事件处理程序。

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

【讨论】:

  • 非常感谢您的回复。我理解这个概念,但我在页面上有 100 个控件,需要在 Init 上加载,这会使页面无响应。所以,如果有任何其他解决方案,请告诉我。
  • 无论您在页面生命周期的哪个位置添加它们,都将花费相同的处理时间。我猜你不是每次都添加所有 100 个。添加哪些控件的决定取决于在呈现页面时添加了哪些控件。将此决定保存在 ViewState 帮助中,以便在下一次回发时仅添加这些控件
  • 不,因为所有这些用户控件都是动态添加的,我无法处理这些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多