web-dev-qa-db-ja.com

別のフォームから関数を呼び出す方法

私のプロジェクトには、設定フォームとメインフォームがあります。設定フォームからメインフォームのMasterReset関数を呼び出そうとしていますが、何も起こりません。
マスターフォームのMasterreset関数は次のようになります。

public void MasterReset()
    {
        DialogResult dialogResult = MessageBox.Show("Are you sure you want to perform master reset? All settings will be set to default.", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
        if (dialogResult == DialogResult.Yes)
        {
            string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            string phonebook_path = path + "\\Phonebook\\Contacts.xml";
            XmlDocument xDoc = new XmlDocument();
            xDoc.Load(phonebook_path);
            XmlNode xNode = xDoc.SelectSingleNode("People");
            xNode.InnerXml = "";
            xDoc.Save(phonebook_path);
            listView1.Clear();
            people.Clear();
        }
        else if (dialogResult == DialogResult.No)
        {
            return;
        }
    }

そして、私はこのような設定フォームからアクセスしています

private void btn_MasterReset_Click(object sender, EventArgs e)
{
    Main f1 = new Main();
    f1.MasterReset();
}

結果が表示されないのはなぜですか?

4
Exinta Enea

これは私にとってはうまくいきました:あなたのプログラムクラスで、Formと呼ばれるMainの静的インスタンス(つまり、クラス)を宣言します。次に、Mainメソッドの先頭でForm = new Main();を使用します。したがって、アプリを起動するときは、Application.Run(Form);を使用します。

public static Main Form;

static void Main() {
    Form = new Main();
    Application.Run(Form)
}

これで、別のフォームから関数を呼び出すのは簡単です。

Program.Form.MasterReset();  //Make sure MasterReset is a public void
4
Blue0500

継承をめぐる構成 とは何か知っていますか?

MasterResetがある形式では、次のようにする必要があります。

2番目のフォームにこのようなものがあり、「メインフォーム」が「マスターフォーム」と呼ばれると仮定しましょう。

public partial class Form1 : Form
{
    private MasterForm _masterForm;  

    public Form1(MasterForm masterForm )
    {
        InitializeComponent();
        _masterForm = masterForm;  

    }
}

MasterFormクラスのコードは次のとおりです。

 private void button2_Click(object sender, EventArgs e)
 {
     Form1  form1 = new Form1(this);

 } 

これがあなたのフォームです1:

private void btn_MasterReset_Click(object sender, EventArgs e)
{
    _masterForm.MasterReset();
} 

お役に立てれば!

11
BRAHIM Kamel

可能な解決策は複数あります。しかし、問題自体は悪い設計から生じます。多くの人がアクセスできるものが必要な場合、なぜそれは誰かのものである必要がありますか?ただし、何かについて何かを通知したい場合は、イベントを使用してください。

あなたの間違いは、_form1_の別のインスタンスを作成していることです。したがって、MasterResetはフォームで動作しており、表示されていません。

あなたにできること:

  1. (Ravshanjonが示唆するように)そのMasterReset(そして多分何か他のもの)を処理するための別のクラスを作成します。しかし、それにイベントを追加します。 _form1_と_form2_はどちらもサブスクライブでき、どちらかがMasterResetを呼び出すと、両方ともreactになります。

  2. フォームの依存関係を作成する(BRAHIM Kamelが提案したように):_form2_を作成し、それに_form1_インスタンスを(コンストラクターパラメーターとして、またはパブリックプロパティを設定して)渡すと、パブリックの非静的メソッドを呼び出すことができます_form1_の。

  3. 迅速ですが、比較的正当な解決策として、このメソッドをstaticにします。


_private static Form1 _instance;

public Form1()
{
    InitializeComponents();
    _instance = this;
}

public static void MasterReset()
{
    // alot of code
    _instance.listView1.Clear();
    // alot of code
}
_

このようにして、このForm1.MasterReset()のような他の形式からMasterResetを呼び出すことができます。この方法の欠点は、_form2_のインスタンスを複数持つことができないことです(とにかく可能性が高いです)。

3
Sinatr

私はあなたの問題を理解しています、あなたはあなたの関数をpublic static voidとして宣言することができます(またlistView1と人々も静的でなければなりません)。次に、このように呼び出したい場合:

private void btn_MasterReset_Click(object sender, EventArgs e)
{
    Main.MasterReset();
}
0
r.mirzojonov