如何从Windows.Form调用UserControl的方法

时间:2018-10-08 22:27:49

标签: c# winforms user-controls

该窗体具有一个按钮和一个带有UserControl的面板,其中UserControl带有一个ListBox和TextBox。

当我单击Windows.Form按钮时,它将调用UserControl的Add()

listBoxTitles.Items.Add(metroTextBoxTitles.Text);
metroTextBoxTitles.Clear();

这只是将UserControl的TextBox.Text具有的内容添加到UserControl的ListBox中。

由于某些原因,当我单击按钮时什么也没发生。
为什么。用户控件上的任何内容都不能更改或使用?还是会更改,但不会更新/显示正在发生的事情?

2 个答案:

答案 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();

一切正常。