C#形式:引发鼠标事件(从子级传递到父级)

时间:2018-07-02 12:48:06

标签: c# event-handling mousedown

寻找任何解决方案。 我有一个带有几个文本框的用户控件。当放置在窗体上时,仅当在用户控件主体上单击时才会触发MouseDown和MouseMove事件,而在文本框中单击时不会触发。 发生文本框mousedown事件时,是否可以引发用户控件的mousedown事件? 还是可以将事件从对象传递到其父对象? (是否还可以单击文本框进行编辑?)

谢谢

1 个答案:

答案 0 :(得分:1)

在此示例中,我已经处理了TextBoxes MouseDown事件。在这里,您可以引发保存您的MouseDown的UserControl的TextBox事件。

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        OnMouseDown(e); // Goes through as a MouseDown Event from UserControl1
    }
}

根据您的要求,这可能对您不起作用,因为在处理UserControl的MouseDown时,它是由UserControl发起的(发送者参数将引用UserControl1。

我还提取了OnMouseDown类的Control实现,以查看是否可以使用它:

        // Extracted using Reflection
        // This will not compile as Control.EventMouseDown is a private member
        System.Windows.Forms.MouseEventHandler mouseEventHandler = (System.Windows.Forms.MouseEventHandler)this.Events[System.Windows.Forms.Control.EventMouseDown];
        if (mouseEventHandler == null)
            return;
        mouseEventHandler(sender, e);

不幸的是,事件存储在Private成员中,并且不易访问。

如果您想以不同的方式来了解和处理MouseDown事件(如果它起源于TextBox),则必须声明并引发一个自定义事件。

声明自定义事件

public event EventHandler<MouseEventArgs> TextBoxMouseDownEvent;

从TextBox_MouseDown引发自定义事件

private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
    EventHandler<MouseEventArgs> handler = TextBoxMouseDownEvent;
    if (handler != null)
    {
        handler(sender, e);
    }
}