在我的其他自定义控件中从我的自定义控件调用我的表单方法

Invoke my forms method from my custom control within my other custom control

在此处查看并找到了几个示例,但它们似乎不符合我的确切问题,并且通过实验我无法解决。

表格的当前代码...

 public partial class Form1 : Form
    {

        DualCombo dc = new DualCombo();
        public Form1()
        {
            InitializeComponent();
            this.Controls.Add(dc);
        }

        private void MyMethod()
        {
            MessageBox.Show(dc.c1.Text + dc.c2.Text);

        }

        private void Form1_Load(object sender, EventArgs e)
        {



        }
    }

包含我的 2 个自定义组合的控件...

public class DualCombo : UserControl
    {
        public CustomCombo c1 = new CustomCombo();
        public CustomCombo c2 = new CustomCombo();
        public DualCombo()
        {

                c1.Items.Add("One");
                c1.Items.Add("Two");
                c1.Items.Add("Three");


                c2.Left = c1.Right;
                c2.Items.Add("One");
                c2.Items.Add("Two");
                c2.Items.Add("Three");

            this.Controls.Add(c1);
            this.Controls.Add(c2);
        }

    } 

我已将自定义组合中的代码留空以保持示例简单...

public class CustomCombo : ComboBox
    {


    }

我希望更改自定义组合 OnSelectedIndex 以触发以下形式的方法...

 private void MyMethod()
            {
                MessageBox.Show(dc.c1.Text + dc.c2.Text);

            }

最简单的解决方案是直接订阅该事件:

public Form1()
{
    InitializeComponent();
    this.Controls.Add(dc);
    dc.c1.SelectionChangedEvent += (s, e) => MyMethod();
}

但是 c1 public 这不是个好主意,请继续阅读。


UserControl是封装了一些功能的控件。如果您需要通知使用该 UserControl 的人一些简单的事情,请创建一个事件:

将事件添加到 UserControl

public EventHandler SomeEvent;
protected void OnSomeEvent() => SomeEvent?.Invoke(this, EventArgs.Empty);

UserControl

中更改选择时触发它
 protected CustomCombo c1 = new CustomCombo();
 public DualCombo()
 {
     c1.SelectedIndexChanged += (s, e) => OnSomeEvent();
     ...
 }

现在您可以在您的表单中订阅该活动(使用此 UserControl 的地方):

DualCombo dc = new DualCombo();
public Form1()
{
    InitializeComponent();
    this.Controls.Add(dc);
    dc.SomeEvent += (s, e) => MyMethod(); // call your method
}

提示:不要在UserControlpublic里面制作控件。将 UserControl 视为一个黑盒子。