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

时间:2016-06-07 09:53:33

标签: c# winforms oop events user-controls

在这里看了一下,发现了几个例子,但它们似乎不适合我的确切问题,通过实验,我无法解决这个问题。

表单的当前代码...

 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);

            }

1 个答案:

答案 0 :(得分:2)

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

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

但是,让c1公开是个坏主意,请进一步阅读。

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
}

提示:请勿在{{1​​}} UserControl内进行控制。将public视为黑匣子。