Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用户控件在窗体内通信的最佳方式_C#_Winforms_User Controls_Datatable - Fatal编程技术网

C# 用户控件在窗体内通信的最佳方式

C# 用户控件在窗体内通信的最佳方式,c#,winforms,user-controls,datatable,C#,Winforms,User Controls,Datatable,我有一整段的呻吟,现在已经删除了。于是我切入主题: 如何通知userControlA已在userControlB中单击按钮 如何通知主窗体已在userControlA中单击按钮 答案是否在最佳解决方案中提供?我正在寻找最佳解决方案。示例 public partial class UserControlA { // method to inform public void DoSomething(string text) { ... // do somet

我有一整段的呻吟,现在已经删除了。于是我切入主题:

  • 如何通知
    userControlA
    已在
    userControlB
    中单击按钮
  • 如何通知主窗体已在
    userControlA
    中单击按钮
  • 答案是否在最佳解决方案中提供?我正在寻找最佳解决方案。

    示例

    public partial class UserControlA
    {
    
        // method to inform
        public void DoSomething(string text)
        {
            ... // do something with text
        }
    }
    
    public partial class UserControlB
    {
        public event Action SomethingChanged;
        public string SomeText {get; set;} // some property
    
        private void button1Clicked(object sender, EventArgs e)
        {
            if(SomethingChanged != null)
                SomethingChanged(); 
        }
    }
    
    // in form contructor (for demonstration purpose)
    var a = new UserControlA();
    var b = new UserControlB();
    this.Controls.Add(a);
    this.Controls.Add(b);
    var handler = () => a.DoSomething(b.SomeText);
    b.SomethingChanged += handler;
    

    现在,当您在
    UserControlB
    中单击
    button1
    时,
    UserControlA
    将调用其
    DoSomething()
    方法。表单用于传递事件,但您可以直接在
    UserControlA
    中订阅事件,您需要以某种方式传递
    UserControlB
    的实例(属性、方法、构造函数)。

    创建事件+侦听器。以主窗体/其他格式订阅(收听)活动usercontrol@DGibbs你的意思是像链接文章中提供的那样?这是你的建议还是你有更简单的方法。因为会有很多听众和活动。这比把一个巨大的类划分成部分类有什么好处。每个人都会认出其他人。这几乎是我的主要问题。当你说“将有许多侦听器和事件”时:可能每个用户控件只需要一个事件,然后随事件传递一些信息,例如,哪个按钮被按下。将用户控件视为普通控件(例如,
    按钮
    )。当您想知道是否在
    userControlB
    中单击了特定按钮时,请创建一个事件,以便任何人(例如表单)都可以订阅它。您可以只使用一个事件进行多个更改,例如,如果您只想通知侦听器“嘿,有什么更改,请再次检查我的所有属性”。@Sinatr您可以给出一个更可靠的“只使用一个事件进行多个更改”的示例吗?链接中提供的是一个很好的例子吗?