C# 为什么动态创建的用户控件没有';t点火按钮点击事件

C# 为什么动态创建的用户控件没有';t点火按钮点击事件,c#,.net,winforms,user-controls,C#,.net,Winforms,User Controls,我的用户控制有问题。 单击按钮后,我在我的aspx页面上动态创建它: protected void btnAddRules_Click(object sender, EventArgs e) { RuleProperty Control = (RuleProperty)LoadControl("RuleProperty.ascx"); MyPanel.Controls.Add(Control); } 当我单击

我的用户控制有问题。 单击按钮后,我在我的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);
    }
protectedvoid btnAdd\u Click1(对象发送者,事件参数e)
{
WowzaRule rule=GetRuleFromGUI();
规则列表。添加(规则);
//会话[“规则列表”]=规则列表;
//列表测试=新列表();
SaveToXMLFiles(txtdbnum.Text,规则列表);
}
我知道在按下mypage上的按钮后,usercontrol被释放,如果它不是在pag_init或page Load上创建的,它将不会保留,但我需要在我的button click事件中创建它,并找到一种方法使它不会消失


提前感谢Daniel,您可能需要添加一个事件处理程序,它可以触发click事件并调用您的代理

Control.Click += btnAdd_Click1;

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

  • RuleProperty
    在按钮单击后添加
  • 使用此控件加载页面
  • 用户单击
    RuleProperty
  • 控件在页面加载期间不会添加到控件树中(相应的代码仅在按钮单击处理程序中,并且该按钮未被单击)
  • ASP.NET不知道是哪个控件触发了该事件,因此不会处理该事件
  • 要解决这个问题,您需要在每个页面加载上添加控件,例如使用
    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;
    }
    

    请注意,这里的事件名称不是真实的,这只是一个可以执行的操作的草图。

    我应该在哪里添加它?我的用户控件不是按钮。我无法写入控件。单击“我没有此选项…”。。。。。。您必须通过用户控件公开该单击事件,并将其重定向到用户控件中按钮的事件您已经用
    winforms
    标记了问号,但看起来您有一个asp.net应用程序和web表单还有一件事,用户控件的按钮事件完成后,如何返回页面?您的意思是“如何删除控件”?如果是,则只需将
    btnAdd\u Click1
    中的ViewState标志重置为false即可。该标志本应有效。您可以发布您尝试过的代码吗?受保护的void btnAdd_Click1(对象发送者,事件参数e){WowzaRule rule=GetRuleFromGUI();RuleList.Add(规则);SaveToXMLFiles(txtdbnum.Text,RuleList);ViewState[“AddRuleProperty”]=false;}ViewState是像会话一样工作,还是以不同的方式附加到每个页面?也许这就是它不起作用的原因?