在 UserControl 中处理来自主窗体的事件

Handling event from main form in UserControl

我正在尝试在主窗体中出现事件时在 UserControl 中执行代码。

表单代码:

public partial class mainForm : Form {
    ...

    public event EventHandler listBoxIndexChanged;

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
        listBoxIndexChanged?.Invoke(sender, e);
    }
}

这里要提到的重要一点是,实际形式的 Name 也是 mainForm,就像类名一样。

用户控件代码:

public partial class userControl1 : UserControl {
    public userControl1() {
        InitializeComponent();
        mainForm.listBoxIndexChanged += mainForm_listBox1_IndexChanged;
    }

    private void mainForm_listBox1_IndexChanged(object sender, EventArgs e) {
        // my code
    }
}

此代码抛出错误 An object reference is required for the non-static field, method, or property 'mainForm.listBoxIndexChanged'。我确定这很明显,但我做错了什么?

WinForms .NET Framework 4.8,VS 2019。

其运行方式是先创建 MainForm,然后在 MainForm 中创建 UserControl 的实例。因此,MainForm 知道 UserControl 但 UserControl 不知道 MainForm。因此,当您告诉 UserControl 使用 MainForm 时,它不知道 MainForm 是什么(无实例)。相反,您会希望 MainForm 在 UserControl 中触发一个方法并将所需的信息传递给它。

在您的用户控件中创建 MainForm 可以调用的方法:

public class UserControl1
{
    public void doSomethingWhenSelectedIndexChanges(int selectedIndex){
        // do stuff inside user control...
    }
}

然后在您的 MainForm 中调用 UserControl 方法。

public class MainForm 
{
    private void ListBox1_SelectedIndexChanged(object sender, eventargs e)
    {
        UserControl1.doSomethingWhenSelectedIndexChanges(ListBox1.SelectedIndex);
    }
}

MainForm 通过这种方式告诉 UserControl ListBox 选定的索引已更改,并将选定的索引传递给 UserControl。