简体   繁体   English

C#通过其他类调用主窗体方法

[英]C# Calling a main form method via other class

I have this project where i contain all my panel instances in my main form. 我有这个项目,我在主窗体中包含所有面板实例。

PanelA aPanelA = new PanelA;
PanelB aPanelB = new PanelB;

This is the form where the program.cs load when it starts. 这是program.cs在启动时加载的形式。 Because i would like to have a centralize place for each panel calling one another method within them hence i declare them in main. 因为我想为每个面板在其中调用另一个方法的位置集中,因此我在main中声明了它们。 In main, i also make some methods doing certain function in these panel since they are declare in main. 在main中,由于它们是在main中声明的,因此我也使一些方法在这些面板中执行某些功能。

void setPanelA (int iNumber){...}
void setPanelB (string strString){...}

The problem is how would a widget in PanelA call the method setPanelB() via main? 问题是PanelA中的小部件将如何通过main调用方法setPanelB()?

Main.setPanelB("Hello World);

I know i can declare PanelA and PanelB as static. 我知道我可以将PanelA和PanelB声明为静态的。 But is this the only way to do it? 但这是唯一的方法吗? Because if i declare static to both Panel, i will need to declare some instances within Panel as static too.. 因为如果我对两个Panel都声明为静态,则也需要在Panel中将某些实例声明为静态。

I also do not wish to declare PanelA in PanelB or via versa because i could have many type of panels and this would make my code very untidy. 我也不希望在PanelB中或通过反之亦然来声明PanelA,因为我可以使用许多类型的面板,这会使我的代码非常混乱。

*Edited I had add a sample code here *编辑后,我在此处添加了示例代码

 namespace TestPanel
 {
    public partial class Form1 : Form
    {
    PanelA aPanelA = new PanelA();
    PanelB aPanelB = new PanelB();        
    //IT IS POSSIBLE TO HAVE TENS OF DIFFERENT TYPE OF PANEL

    public Form1()
    {
        InitializeComponent();
    }

    //CENTRAL LOCATION WHERE ALL PANEL COULD CALL EACH OTHER METHOD
    public void setPanelACentral(int iNew) 
    {
        aPanelA.setPanelA(iNew);
    }
    public void setPanelBCentral(string strNew) 
    {
        aPanelB.setPanelB(strNew);
    }
}    
public class PanelA
{
    int i = 0;
    public void setPanelA(int iNew)
    {
        i = iNew;
    }
}
public class PanelB
{
    string str = "";
    public void setPanelB(string strNew)
    {
        str = strNew;
    }

    //PROBLEM HERE HOW TO ACCESS MAIN setPanelACentral
    public void changePanelA() 
    {
        int i = 1000;
        Form1.setPanelACentral(i); //<- This the part where i am asking
    }
}  

} }

The following code demonstrates adding Events to both your Panel types and Form1 . 以下代码演示了将事件添加到Panel类型和Form1 By doing this, you can raise an event in your Panel that Form1 will have registered to handle. 这样,您可以在面板中引发一个Form1将要注册处理的事件。

public partial class Form1 : Form
{
    protected EventHandler<PanelEventArg> OnSetPanelA = new EventHandler<PanelEventArg>((sender, e) => { }); //stub
    protected EventHandler<PanelEventArg> OnSetPanelB = new EventHandler<PanelEventArg>((sender, e) => { }); //stub

    protected List<PanelBase> panels;

    public Form1() : base()
    {
        panels = new List<PanelBase>
        {
            new PanelA(),
            new PanelB()
        };

        foreach (var panel in panels)
        {
            OnSetPanelA += panel.OnSetPanel;
            OnSetPanelB += panel.OnSetPanel;

            panel.OnSomeEvent += Form1_OnSomeEvent;
        }

        foreach (var panel in panels.OfType<PanelB>())
        {
            panel.OnChangePanelA += Form1_OnChangePanelA;
        }

        InitializeComponent();
    }


    protected void SetPanelA(int iNew)
    {
        foreach (var panel in panels.OfType<PanelA>())
        {
            panel.SetPanelA(iNew);
            OnSetPanelA(this, new PanelEventArg
            {
                Panel = panel
            });
        }
    }

    protected void SetPanelB(string strNew)
    {
        foreach (var panel in panels.OfType<PanelB>())
        {
            panel.SetPanelB(strNew);
            OnSetPanelA(this, new PanelEventArg
            {
                Panel = panel
            });
        }
    }

    protected void Form1_OnSomeEvent(object sender, EventArgs e)
    {
        // handles events raised by the panel.
    }

    protected void Form1_OnChangePanelA(object sender, int iNew)
    {
        SetPanelA(iNew);
    }
}

Helper Types I'm including: PanelEventArg , PanelBase 我包括的帮助程序类型: PanelEventArgPanelBase

public class PanelEventArg : EventArgs
{
    public PanelBase Panel { get; set; }
}

public class PanelBase //: Panel
{
    public EventHandler OnSomeEvent = new EventHandler((sender, e) => { }); //stub;

    public void OnSetPanel(object sender, PanelEventArg e)
    {
        if (!Equals(e.Panel, this))
        {
            //the panel being set is not this panel instance
        }
    }
}

Declaring PanelA and PanelB , with inheritance and new Event for PanelB 声明PanelAPanelB ,以继承和新的事件PanelB

public class PanelA : PanelBase
{
    int i = 0;
    public void SetPanelA(int iNew)
    {
        i = iNew;
    }
}

public class PanelB : PanelBase
{
    public EventHandler<int> OnChangePanelA = new EventHandler<int>((sender, e) => { }); //stub

    string str = "";

    public void SetPanelB(string strNew)
    {
        str = strNew;
    }

    //PROBLEM HERE HOW TO ACCESS MAIN setPanelACentral
    public void ChangePanelA()
    {
        OnChangePanelA(this, 1000);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM