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

C# 在UserControl中处理来自主窗体的事件,c#,.net,winforms,event-handling,C#,.net,Winforms,Event Handling,当从主窗体引发偶数时,我尝试在UserControl中执行代码 表格编号: public分部类mainForm:Form{ ... 公共事件事件处理程序listBoxIndexChanged; 私有无效列表框1\u SelectedIndexChanged(对象发送方,事件参数e){ listBoxIndexChanged?.Invoke(发送方,e); } } 这里需要特别指出的是,实际表单的名称也是mainForm,就像类名一样 用户控制代码: 公共部分类userControl1:User

当从主窗体引发偶数时,我尝试在UserControl中执行代码

表格编号:

public分部类mainForm:Form{
...
公共事件事件处理程序listBoxIndexChanged;
私有无效列表框1\u SelectedIndexChanged(对象发送方,事件参数e){
listBoxIndexChanged?.Invoke(发送方,e);
}
}
这里需要特别指出的是,实际表单的
名称
也是
mainForm
,就像类名一样

用户控制代码:

公共部分类userControl1:UserControl{
公共用户控制1(){
初始化组件();
mainForm.listBoxIndexChanged+=mainForm\u listBox1\u IndexChanged;
}
私有void mainForm_listBox1_IndexChanged(对象发送方,事件参数e){
//我的代码
}
}
此代码引发错误
非静态字段、方法或属性'mainForm.listBoxIndexChanged'
需要对象引用。我相信这是显而易见的,但我会做错什么呢


WinForms.NET Framework 4.8版,与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列表框所选索引已更改,并将所选索引传递给UserControl。

这种运行方式是先创建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列表框所选索引已更改,并将所选索引传递给UserControl。

MainForm实例来自哪里?看起来此对象与表单类具有相同的名称。。。您的UC如何知道
mainForm
?表单对象确实与类具有相同的名称。这是个错误吗?既然你提到了这一点,这是有道理的。我想我的UC不知道
mainForm
的存在。我应该怎么做?你的UC怎么知道存在一个
mainForm
类?你从哪里得到这个例子的?UC如何知道表单实例具有公共事件?为什么您的UC关心此表单的特定子控件?还是它关心一些价值观?也许你有一个设计缺陷…依赖性最好是反向的。在用户控件中创建一个公共方法,如
public void DoSomething(){/*my code*/}
。然后在表单中,处理表单中的事件,并在用户控件的实例上调用
DoSomething
方法。@Jimi请解释我做错了什么,而不是问这些问题。我不知道答案。我是一个完全的业余爱好者,你的这些问题让我感到焦虑,我甚至连一半的单词都听不懂。当列表框的一个
SelectedIndex
更改时,我只想根据两个列表框
SelectedIndex
更改我的
UserControl
中某些控件的
Visible
属性。
mainForm
实例来自哪里?看起来此对象与表单类具有相同的名称。。。您的UC如何知道
mainForm
?表单对象确实与类具有相同的名称。这是个错误吗?既然你提到了这一点,这是有道理的。我想我的UC不知道
mainForm
的存在。我应该怎么做?你的UC怎么知道存在一个
mainForm
类?你从哪里得到这个例子的?UC如何知道表单实例具有公共事件?为什么您的UC关心此表单的特定子控件?还是它关心一些价值观?也许你有一个设计缺陷…依赖性最好是反向的。在用户控件中创建一个公共方法,如
public void DoSomething(){/*my code*/}
。然后在表单中,处理表单中的事件,并在用户控件的实例上调用
DoSomething
方法。@Jimi请解释我做错了什么,而不是问这些问题。我不知道答案。我是一个完全的业余爱好者,你的这些问题让我感到焦虑,我甚至连一半的单词都听不懂。我只想更改my
UserControl
中某些控件的
Visible
属性,具体取决于两个列表框
SelectedIndex
,当其中一个列表框的
SelectedIndex
发生更改时。