在这里看了一下,发现了几个例子,但它们似乎不适合我的确切问题,通过实验,我无法解决这个问题。
表单的当前代码...
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);
}
答案 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
视为黑匣子。