【问题标题】:Handling event from main form in UserControl在 UserControl 中处理来自主窗体的事件
【发布时间】:2021-01-15 12:26:40
【问题描述】:

当从主窗体引发偶数时,我正在尝试在 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 instance 来自哪里?看起来这个对象与 Form 类同名……你的 UC 怎么知道mainForm
  • 表单对象确实与类同名。这是一个错误吗?这是有道理的,现在你提到它。我想我的 UC 不知道mainForm 的存在。我该怎么办?
  • 你的 UC 怎么知道mainForm 类的存在?你从哪里得到那个Instance? UC 怎么知道一个表单 Instance 有一个公共事件?为什么您的 UC 关心此表单的特定子控件?还是它关心一些价值观?也许你有设计缺陷......
  • 依赖关系最好是反向的。在您的用户控件中创建一个像 public void DoSomething(){/*my code*/} 这样的公共方法。然后在表单中,处理表单中的一个事件,并在用户控件的实例上调用DoSomething方法。
  • @Jimi 请解释我做错了什么而不是问这些问题。我不知道答案。我是一个完全的业余爱好者,你让我对这些问题感到焦虑,我什至连一半话都听不懂。当 ListBox 的 SelectedIndex 之一发生变化时,我只想根据 2 个 ListBox SelectedIndex 更改我的 UserControl 中某些控件的 Visible 属性。

标签: c# .net winforms event-handling


【解决方案1】:

它的运行方式是首先创建 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多