私のプロジェクトには、設定フォームとメインフォームがあります。設定フォームからメインフォームの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();
}
結果が表示されないのはなぜですか?
これは私にとってはうまくいきました:あなたのプログラムクラスで、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
継承をめぐる構成 とは何か知っていますか?
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();
}
お役に立てれば!
可能な解決策は複数あります。しかし、問題自体は悪い設計から生じます。多くの人がアクセスできるものが必要な場合、なぜそれは誰かのものである必要がありますか?ただし、何かについて何かを通知したい場合は、イベントを使用してください。
あなたの間違いは、_form1
_の別のインスタンスを作成していることです。したがって、MasterReset
はフォームで動作しており、表示されていません。
あなたにできること:
(Ravshanjonが示唆するように)そのMasterReset
(そして多分何か他のもの)を処理するための別のクラスを作成します。しかし、それにイベントを追加します。 _form1
_と_form2
_はどちらもサブスクライブでき、どちらかがMasterReset
を呼び出すと、両方ともreactになります。
フォームの依存関係を作成する(BRAHIM Kamelが提案したように):_form2
_を作成し、それに_form1
_インスタンスを(コンストラクターパラメーターとして、またはパブリックプロパティを設定して)渡すと、パブリックの非静的メソッドを呼び出すことができます_form1
_の。
迅速ですが、比較的正当な解決策として、このメソッドを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
_のインスタンスを複数持つことができないことです(とにかく可能性が高いです)。
私はあなたの問題を理解しています、あなたはあなたの関数をpublic static voidとして宣言することができます(またlistView1と人々も静的でなければなりません)。次に、このように呼び出したい場合:
private void btn_MasterReset_Click(object sender, EventArgs e)
{
Main.MasterReset();
}