【问题标题】:Invoke my forms method from my custom control within my other custom control从我的其他自定义控件中的自定义控件调用我的表单方法
【发布时间】:2016-06-07 09:53:33
【问题描述】:

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

表单的当前代码...

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

            }

【问题讨论】:

    标签: c# winforms oop events user-controls


    【解决方案1】:

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

    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
    }
    

    提示:不要在 UserControl public 内制作控件。将UserControl 视为一个黑匣子。

    【讨论】:

    • 感谢您的详细解答。但是我得到 OnSomeEvent 在当前上下文中不存在。
    • 你在哪里称呼它?也许你写错了dc.OnSomeEvent += ...(应该是dc.SomeEvent += ...)?
    • 它在双重组合中 c1.SelectedIndexChanged += (s, e) => OnSomeEvent();
    • 好的,我把它放在了... public EventHandler SomeEvent; protected void OnSomeEvent() => SomeEvent?.Invoke(this, EventArgs.Empty);在自定义组合而不是双重组合中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2018-03-03
    • 2013-10-23
    相关资源
    最近更新 更多