1

コンボボックス(devexpress)での選択時にコントロールを動的にロードするWebフォームがあります。メインフォームに次のコードがあります

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {

        }
        if (Session["_active_control"] != null)//persist control on postbacks
        {
            Control cntrl = Session["_active_control"] as Control;
            pnl_main.Controls.Clear();
            pnl_main.Controls.Add(cntrl);
        }
    }

    protected void cmb_control_SelectedIndexChanged(object sender, EventArgs e)
    {
        Control cntrl= Page.LoadControl("~/" + cmb_control.SelectedItem.Value);
        pnl_main.Controls.Clear();
        pnl_main.Controls.Add(cntrl);
       Session["_active_control"] = cntrl;
    }

また、3 つのテキスト ボックスとコードを持つボタンを持つユーザー コントロールがあります。

  protected void btn_save_Click(object sender, EventArgs e)
    {
        lbl.Text = ASPxTextBox1.Text + "<br>" + ASPxTextBox2.Text + "<br>" + ASPxTextBox3.Text;
    }

私の問題は、動的にロードするとユーザーコントロールの保存ボタンが起動しないことです(ブレークポイントと上記のコードを使用して確認しましたが、静的に使用するとスムーズに実行されます(つまり、デザインモードでドラッグすることにより)

4

2 に答える 2

1

ポストバック全体でコントロールを保持する必要があることは正しいです。

ただし、Page Load イベントはコントロールを追加するには遅すぎます。ページの Init イベントでこれを行うと、うまくいくはずです。ポストバック イベントを受け取るには、ProcessPostData (PreLoad の前に呼び出される) が呼び出されるときにコントロールが存在する必要があります。

テキストボックスについても、ユーザーが入力した値を受け取る必要があります。これは ProcessPostData でも発生します。その後にコントロールを追加すると、ユーザーが入力した値を受け取ることができなくなります。

参照: ASP.NET ページのライフ サイクル

于 2012-12-24T08:17:13.090 に答える
0

ねえ、私は解決策を見つけました

代わりに、combobox_selectedindexchanged でコントロールを作成する代わりに、combobox.selectedindex に基づいてページロードにコントロール作成コードを配置します。

 protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        if (cmb_control.SelectedItem != null)
        {
            Control cntrl = Page.LoadControl("~/" + cmb_control.SelectedItem.Value);
            cntrl.ID = "_new_ctrl" + cmb_control.SelectedItem.Value;

            pnl_main.Controls.Clear();
            pnl_main.Controls.Add(cntrl);
        }

    }

ASP .Net の使用コントロール内でボタン クリック イベントが発生しないを参照してください。

于 2012-12-24T12:29:10.377 に答える