簡體   English   中英

C#通過其他類調用主窗體方法

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

我有這個項目,我在主窗體中包含所有面板實例。

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

這是program.cs在啟動時加載的形式。 因為我想為每個面板在其中調用另一個方法的位置集中,因此我在main中聲明了它們。 在main中,由於它們是在main中聲明的,因此我也使一些方法在這些面板中執行某些功能。

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

問題是PanelA中的小部件將如何通過main調用方法setPanelB()?

Main.setPanelB("Hello World);

我知道我可以將PanelA和PanelB聲明為靜態的。 但這是唯一的方法嗎? 因為如果我對兩個Panel都聲明為靜態,則也需要在Panel中將某些實例聲明為靜態。

我也不希望在PanelB中或通過反之亦然來聲明PanelA,因為我可以使用許多類型的面板,這會使我的代碼非常混亂。

*編輯后,我在此處添加了示例代碼

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

}

以下代碼演示了將事件添加到Panel類型和Form1 這樣,您可以在面板中引發一個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);
    }
}

我包括的幫助程序類型: 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
        }
    }
}

聲明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