0

ユーザー コントロールの LoadControl を使用してコードを介してユーザー コントロールが動的に追加される div があるページがあります。

ユーザー コントロールには別のユーザー コントロールが含まれています (ChildUC としましょう)。ChildUC には、挿入ボタンと削除ボタンを持つグリッドビューが含まれています。

問題は、これらのボタンをクリックしても、クリック イベントも 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。それまでにコントロールがコントロールコレクションに存在しない場合、イベントを受信できません。したがって、ポストバックは取得されますが、イベントハンドラーは起動されません。

つまり、イベントハンドラーを起動する場合は、loadイベントの前にすべてのコントロールを作成する必要があります。ユーザーの入力に応じて、ロードするコントロールを決定する必要があるようです。でユーザー入力を使用することはできませんInit。メソッドをオーバーライドして、LoadViewStateそこでユーザー入力を処理できます。

ページのライフサイクル

于 2012-08-06T19:51:21.807 に答える