为什么我的动态创建的用户控件不会触发按钮单击事件

时间:2014-01-02 10:54:35

标签: c# .net winforms user-controls

我的用户控制有问题。 我点击按钮后在我的aspx页面上动态创建它:

protected void btnAddRules_Click(object sender, EventArgs e)
    {          
        RuleProperty Control = (RuleProperty)LoadControl("RuleProperty.ascx");         
        MyPanel.Controls.Add(Control);
    }

当我点击我的用户控件的按钮时,按钮事件不会触发,用户控件将消失。这是按钮事件:

protected void btnAdd_Click1(object sender, EventArgs e)
    {
        WowzaRule rule = GetRuleFromGUI();
        RuleList.Add(rule);
        //Session["RuleList"] = RuleList;
        //List<WowzaRule> test = new List<WowzaRule>();
        SaveToXMLFiles(txtdbnum.Text, RuleList);
    }

据我所知,在按下mypage上的按钮后,usercontrol被释放,如果它没有在pag_init或页面上创建加载它就不会停留,但是我需要在我的按钮点击事件上创建它并找到一种方法让它不消失。

提前感谢,Daniel

2 个答案:

答案 0 :(得分:1)

您可能必须添加一个事件处理程序,它可以触发click事件并调用您的委托

Control.Click += btnAdd_Click1;

答案 1 :(得分:0)

动态创建的控件一旦添加,就必须位于每个页面加载的页面上才能正常工作。你的情况会发生什么:

    点击按钮后添加
  1. RuleProperty
  2. 使用此控件加载页面
  3. 用户点击RuleProperty
  4. 中的按钮
  5. 在页面加载期间,控件未添加到控件树中(相应的代码仅在按钮单击处理程序中,并且未单击该按钮)
  6. ASP.NET不知道哪个控件触发了该事件,因此未处理该事件
  7. 要解决此问题,您需要在每个页面加载时添加控件,例如使用ViewState中存储的一些标记:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (ViewState["AddRuleProperty"] != null && (bool)ViewState["AddRuleProperty"])
        {
            AddRulePropertyControl();
        }
    }
    
    protected void btnAddRules_Click(object sender, EventArgs e)
    {
        AddRulePropertyControl();          
        ViewState["AddRuleProperty"] = true;
    }
    
    private void AddRulePropertyControl()
    {
        RuleProperty Control = (RuleProperty)LoadControl("RuleProperty.ascx");         
        MyPanel.Controls.Add(Control);
    }
    

    <强>更新

    如果要稍后在控件的单击处理程序中从页面中删除控件,则需要删除相应的ViewState键。这是直接从控件无法实现的,因为属性Page.ViewState受到保护,而且这也会产生不必要的依赖。

    这样做的正确方法是从页面订阅同一个事件(您可能需要从控制器中看到此事件)并在那里重置密钥。像这样:

    private void AddRulePropertyControl()
    {
        RuleProperty Control = (RuleProperty)LoadControl("RuleProperty.ascx");         
        Control.ButtonClick += RuleProperty_ButtonClick;
        MyPanel.Controls.Add(Control);
    }
    
    private void RuleProperty_ButtonClick()
    {
        ViewState["AddRuleProperty"] = false;
    }
    

    请注意,此处的事件名称不是真实的,这只是可以做什么的草图。