【问题标题】:User control click event not working when clicking on text inside control?单击控件内的文本时,用户控件单击事件不起作用?
【发布时间】:2012-03-13 01:13:18
【问题描述】:

我有一个名为GameButton 的用户控件,其中有一个标签。当我将用户控件添加到我的表单并为其添加单击事件时,它会在您单击自定义按钮的背景时触发,而不是标签中的文本?如果不在用户控件代码中添加一堆点击事件,我将如何解决这个问题?

编辑:UI 框架:winforms

【问题讨论】:

  • UI 框架(Winforms、WPF、Webforms、MVC)?
  • 另外,请避免包含与您的问题几乎没有关系的标签(例如visual-studio)。
  • 按照设计,Label 控件会获得点击。您可以覆盖 OnPaint() 而不是使用标签作为一种解决方法。
  • 没有标签不响应事件,但背景...
  • 您为什么反对添加一个包含所有必要引用的事件处理程序?您甚至可以使用反射来分配事件处理程序。

标签: c# winforms events onclick mouse


【解决方案1】:

如果我对您的理解正确,您的 GameButton 用户控件将在单击时触发该事件,但在单击标签时不会触发该事件——而您两者都需要。这是因为标签(控件)位于背景之上。因此,您还需要使用点击事件注册您的标签。这可以在设计器中手动完成,也可以针对页面上的每个控件以编程方式完成。

如果您想在 UserControl 中执行每个控件,请将其放入 UserControl 的 OnLoad 事件中,您可以为每个控件使用相同的单击事件:

foreach (var c in this.Controls)
    c.Click += new EventHandler(yourEvent_handler_click);

public void yourEvent_handler_click (object sender, EventArgs e){
    //whatever you want your event handler to do
}

编辑:最好的方法是在用户控件中创建单击事件处理程序属性。这样,每次您向用户控件添加/删除单击事件时,它都会自动将其添加/删除到用户控件中的所有控件。

public new event EventHandler Click {
        add {
            base.Click += value;
            foreach (Control control in Controls) {
                control.Click += value;
            }
        }
        remove {
            base.Click -= value;
            foreach (Control control in Controls) {
                control.Click -= value;
            }
        }
    }

这是另一个post

希望这会有所帮助!

【讨论】:

  • 我希望能够像在设计器中使用常规按钮一样将点击事件添加到我的自定义按钮,但它们不会影响标签
  • 我不确定我是否理解@EfeOzturkoglu。您希望您的用户控件就像是一个常规按钮,您可以使用一个事件处理程序在任何地方单击它?
  • 是的,就像我不想每次都向控件和其中的标签添加处理程序一样,只要我创建按钮的新实例时添加一次即可
  • @EfeOzturkoglu 没问题。很高兴为您提供帮助。
【解决方案2】:

您可以创建一个新方法并将所有控件分配给它

private void Control_Click(object sender, EventArgs e)
{
   this.OnClick(e);
}

这将引发主控件(或用户控件)事件。

【讨论】:

  • 谢谢先生!!这是一个聪明的解决方案
【解决方案3】:

将标签的“启用”属性设置为“False”,则鼠标事件将在用户控件中起作用。

【讨论】:

  • 错误的解决方案,因为这也会使控件变灰。
  • 它对我有用!我为我的用户控件中的所有子控件设置了启用 false!
【解决方案4】:

您可以让用户控件的控件中的事件像这样调用用户控件的事件:

foreach (Control c in this.Controls)
{
    c.Click += (sender, e) => { this.OnClick(e); };
    c.MouseUp += (sender, e) => { this.OnMouseUp(e); };
    c.MouseDown += (sender, e) => { this.OnMouseDown(e); };
    c.MouseMove+= (sender, e) => { this.OnMouseMove(e); };
}

只要把它放在构造函数中。这样,当使用多态将事件添加到用户控件时,它将起作用

【讨论】:

    【解决方案5】:

    这里这个控件有 4 个子控件,比如 3 个标签和 1 个图片框。 所以在 c# 中添加 this.onClick(e) 或在 vb.net 中添加 Me.onClick(e) 点击事件 像这样

    Private Sub rate_lab_Click(sender As Object, e As EventArgs) Handles rate_lab.Click
        Me.OnClick(e)
    End Sub
    

    因此,无论在用户控件内部点击什么,点击事件都充当单个事件

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 2015-12-14
      • 1970-01-01
      相关资源
      最近更新 更多