简体   繁体   中英

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. Because i would like to have a centralize place for each panel calling one another method within them hence i declare them in main. In main, i also make some methods doing certain function in these panel since they are declare in main.

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

The problem is how would a widget in PanelA call the method setPanelB() via main?

Main.setPanelB("Hello World);

I know i can declare PanelA and PanelB as static. 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..

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.

*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 . By doing this, you can raise an event in your Panel that Form1 will have registered to handle.

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

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

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);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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