所以我有以下内容: FormA , FormB , FormCtrl
加载 FormA 后,会显示 FormCtrl :
FormCtrl fc = new FormCtrl();
fc.Show();
从 FormA ,我可以控制 FormCtrl 上的 Panel1 ,也可以加载 FormB :
FormB fb = new FormB();
fb.Show();
fc.Panel1.Visible = true;
在 FormB 中,我需要在 FormCtrl 上控制 Panel2 :
fc.Panel2.Visible = true; // I don't know how to do this :)
答案 0 :(得分:1)
当然是不好的做法,但是您可以像这样传递对FormCtrl的引用:
public partial class FormB: Form
{
public FormCtrl Reference { get; set; }
public FormB(FormCtrl referencedForm)
{
InitializeComponent();
Reference = referencedForm;
Reference.Panel2.Visible = true;
}
}
答案 1 :(得分:0)
处理容器之间通信的最佳方法是实现观察者类
观察者模式是一种软件设计模式,在该模式中,称为主题的对象会维护其依赖者列表(称为观察者),并通常通过调用其方法之一来自动将状态更改通知他们。 (维基百科)
我执行此操作的方式是创建一个Observer类,并在其中编写类似以下内容的内容:
1 public delegate void dlFuncToBeImplemented(string signal);
2 public static event dlFuncToBeImplemented OnFuncToBeImplemented;
3 public static void FuncToBeImplemented(string signal)
4 {
5 OnFuncToBeImplemented(signal);
6 }
所以基本上:第一行说会有别人要实现的功能
第二行正在创建一个事件,该事件在委托函数将调用时发生
第三行是调用事件的函数的创建
因此,在您要从外部更改的窗体(FormCtrl)中,应添加如下函数:
private void ObserverRegister()//will contain all observer function registration
{
Observer.OnFuncToBeImplemented += Observer_OnFuncToBeImplemented;
/*and more observer function registration............*/
}
void Observer_OnFuncToBeImplemented(string signal)//the function that will occur when FuncToBeImplemented(signal) will call
{
MessageBox.Show("Signal "+signal+" received!", "Atention!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
在其他表单(FormA,FormB)中,您应该执行以下操作:
public static int signal = 0;
public void button1_Click(object sender, EventArgs e)
{
Observer.FuncToBeImplemented(signal);//will call the event in the user control
}
现在,您可以将此功能注册到一大堆其他控件和容器中,它们都将获得信号
我希望这会有所帮助:)