在C#上从2种不同的表单控制一个表单

时间:2018-12-03 11:04:24

标签: c# winforms

所以我有以下内容: 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 :)

2 个答案:

答案 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
}

现在,您可以将此功能注册到一大堆其他控件和容器中,它们都将获得信号

我希望这会有所帮助:)