1

我有一个 Web 表单,它在组合框(devexpress)中选择时动态加载控件。我在主窗体上有以下代码

 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;
    }

我也有一个具有三个文本框的用户控件和一个具有代码的按钮

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

我的问题是,如果我动态加载用户控件的保存按钮,它不会触发(我已经使用断点和上面显示的代码进行了检查。但是,如果我静态使用它,它运行顺利。(即通过在设计模式下拖动)

4

2 回答 2

1

你是对的,你必须在回发中保持控制。

但是,页面加载事件为时已晚,无法重新添加您的控件。在页面的 Init 事件上执行此操作,您应该会很好。要接收回发事件,当调用 ProcessPostData(在 PreLoad 之前调用)时,控件应该存在。

同样对于文本框,您将希望接收用户输入的值。这也发生在 ProcessPostData 上,如果在此之后添加控件,您将不会收到用户输入的值。

参考:ASP.NET 页面生命周期

于 2012-12-24T08:17:13.090 回答
0

嘿,我找到了解决方案

而是在 combobox_selectedindexchanged 中创建控件时,我将控件创建代码放在基于 combobox.selectedindex 的 Pageload 上,即

 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 回答