-2

-user コントロールを動的にロードしています。いくつかの送信ボタン コードがあり、実行時にユーザー コントロールが正常に登録されますが、ボタンのクリック時に送信ボタン イベントが発生しません。

ここに私のコードがあります

 switch (ContentTypeID)
        {
            case 1:
                myCtrl = Page.LoadControl("~/Controls/DocumentSpreadSheet.ascx");

                if (myCtrl != null)
                {
                    ((Controls_DocumentSpreadSheet)myCtrl).ddlList = int.Parse(ddlList.SelectedValue);
                    pnlDetails.Controls.Add(myCtrl);
                }
                break;
            case 2:

実行時に登録されるユーザーコントロールには、次のイベントを持つボタンがあります

 protected void btnSave_Click(object sender, EventArgs e)
    {
        if (checkRequiredFields(true) == true)
        {
            saveContentDetails();
            btnCancel_Click(null, null);
            //   loadSummaryGrid(true);
        }
        else
        {
            showMessageBox("Invalid data; please correct all errors.");
        }

    }

このイベントは発生しません。ブレークポイントをアタッチして観察しました。

レンダリングされたマークアップ

<div id="MainContent_ctl00_divButtons">
    <table cellspacing="0" cellpadding="0" border="0" style="width: 97%;
        margin: 10px;" id="Table3">
        <tbody><tr>
            <td align="center" colspan="4">
                <input type="image" src="../images/submit_btn.png" id="MainContent_ctl00_btnInsert" name="ctl00$MainContent$ctl00$btnInsert">
                &nbsp;
                <input type="image" src="../images/cancel-btn.png" id="MainContent_ctl00_btnCancel" name="ctl00$MainContent$ctl00$btnCancel">
                &nbsp;
            </td>
        </tr>
        <tr>
            <td>

            </td>
        </tr>
    </tbody></table>
</div>

実際のマークアップ    

4

1 に答える 1

0

簡単な答え:コントロールを追加するのが遅すぎました。

ボタンクリックを受け入れたい場合は、loadCompleteの前にユーザーコントロールを追加する必要があります。理想的にはそれを追加する必要がありますInit。または、入力に依存する場合は、Loadイベントに追加します。

ボタンクリックイベントなどにコントロールを追加する場合は、問題なくレンダリングされます。ただし、そのコントロールでイベントを受信することはありません。

イベントターゲット(htmlの非表示要素に設定)は、LoadCompleteの後に評価されます。これが評価されたときにコントロールが存在しない場合、イベントを受信しません。

理解しなければならないのは、グリッドのItemCommandイベントが一度発生すると、次のイベントでは発生しないということPostBackです。そのコントロールを追加したことを覚えておく必要がPostBackあります。また、必要になるまで、もう一度追加し直してください。これを覚えておくのに最適な場所はViewStateです。

ViewState現在その特定のコントロールを表示していることを示す変数を設定し、その変数を使用してコントロールをに追加する必要がありますLoadInitViewStateがInitで使用できないため、これを行うことはできません。

于 2012-06-26T11:03:43.263 に答える