该窗体具有一个按钮和一个带有UserControl的面板,其中UserControl带有一个ListBox和TextBox。
当我单击Windows.Form按钮时,它将调用UserControl的Add()
listBoxTitles.Items.Add(metroTextBoxTitles.Text);
metroTextBoxTitles.Clear();
这只是将UserControl的TextBox.Text具有的内容添加到UserControl的ListBox中。
由于某些原因,当我单击按钮时什么也没发生。
为什么。用户控件上的任何内容都不能更改或使用?还是会更改,但不会更新/显示正在发生的事情?
答案 0 :(得分:0)
处理容器之间通信的最佳方法是实现观察者类
观察者模式是一种软件设计模式,在该模式中,称为主题的对象会维护其依赖者列表(称为观察者),并通常通过调用其方法之一来自动将状态更改通知他们。 (维基百科)
我这样做的方式是创建一个Observer类:
1 public delegate void dlFuncToBeImplemented(int signal);
2 public static event dlFuncToBeImplemented OnFuncToBeImplemented;
3 public static void FuncToBeImplemented(int signal)
4 {
5 OnFuncToBeImplemented(signal);
6 }
所以基本上:第一行说会有一个别人可以实现的功能
第二行正在创建一个事件,该事件在委托函数将调用时发生
第三行是调用事件的函数的创建
因此,在您的UserControl中,您应该添加如下函数:
private void ObserverRegister()//will contain all observer function registration
{
Observer.OnFuncToBeImplemented += Observer_OnFuncToBeImplemented;
/*and more observer function registration............*/
}
void Observer_OnFuncToBeImplemented(int signal)//the function that will occur when FuncToBeImplemented(signal) will call
{
MessageBox.Show("Signal received!", "Atention!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
在表单中,您应该执行以下操作:
public static int signal = 0;
public void button1_Click(object sender, EventArgs e)
{
Observer.FuncToBeImplemented(signal);//will call the event in the user control
}
现在,您可以将此功能注册到一大堆其他控件和容器中,它们都将获得信号
我希望这会有所帮助:)
答案 1 :(得分:0)
所以,当您创建一个UserControl并将其添加到Window.Form时,窗体的设计器已经启动了该UserControl:
private UserControl userControl1;
因此,为了解决该问题,我只需要使用设计者代码创建的UserControl:
usercontrol1.add();
一切正常。