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