【问题标题】:Why does my dynamically created user control doesn't fire button click event为什么我动态创建的用户控件不会触发按钮单击事件
【发布时间】:2014-01-02 10:54:35
【问题描述】:

我的用户控制有问题。 单击按钮后,我在我的 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 上的按钮后,用户控件会被释放,如果它不是在 pag_init 或 page Load 上创建的,它不会留下来,但我需要在我的按钮点击事件中创建它并找到一种方法让它不会消失.

提前感谢,丹尼尔

【问题讨论】:

  • 你已经用winforms标签标记了问题,但看起来你有带有网络表单的asp.net应用程序

标签: c# .net winforms user-controls


【解决方案1】:

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

Control.Click += btnAdd_Click1;

【讨论】:

  • 我应该在哪里添加它?
  • 我的用户控件不是按钮。我不能写 Control.Click 我没有这个选项...
  • ...您必须通过用户控件公开该 Click 事件并将其重定向到用户控件中的按钮事件
【解决方案2】:

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

  1. RuleProperty在按钮点击后添加
  2. 使用此控件加载页面
  3. 用户点击RuleProperty内的按钮
  4. 页面加载时控件未添加到控件树中(对应代码仅在按钮点击处理程序中,且该按钮未被点击)
  5. 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;
}

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

【讨论】:

  • 还有一件事,用户控件的按钮事件完成后如何返回我的页面?
  • 您的意思是“我如何删除控件”?如果是,那么只需将 btnAdd_Click1 中的 ViewState 标志重置为 false。
  • 应该可以的。您可以发布您尝试过的代码吗?
  • protected void btnAdd_Click1(object sender, EventArgs e) { WowzaRule rule = GetRuleFromGUI(); RuleList.Add(规则); SaveToXMLFiles(txtdbnum.Text, RuleList); ViewState["AddRuleProperty"] = false; }
  • ViewState 是像会话一样工作,还是以不同的方式附加到每个页面?也许这就是它不起作用的原因?
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 2017-08-03
  • 2018-11-13
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多