在我的项目中,我有一个设置表单和一个主表单。 我试图从设置表单中调用Main表单的MasterReset函数,但没有任何反应 Master form的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();
}
为什么我没有看到任何结果?
答案 0 :(得分:10)
你知道composition over inheritance是什么吗?
在您拥有MasterReset
的表单中,您应该执行以下操作:
Llet假设在你的第二种形式中你有这样的东西,让我们假设你的“主形式”将被称为“MasterForm”。
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();
}
希望这有帮助!
答案 1 :(得分:4)
这对我有用:在你的Program类中,声明一个名为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
答案 2 :(得分:3)
有多种解决方案可行。但问题本身来自糟糕的设计。如果你需要被许多人访问,那为什么它应该属于某人?但是,如果您想要通知任何事情,请使用事件。
您的错误就是您正在创建form1
的另一个实例,因此MasterReset
正在使用表单进行操作,甚至没有显示。
你能做什么:
让(如Ravshanjon所建议的)一个单独的类来处理MasterReset
(也许还有别的东西)。但也加入了一个事件。 form1
和form2
都可以订阅,只要其中任何一个调用MasterReset
- 两者都做出反应。
创建表单依赖项(如BRAHIM Kamel建议的那样):当您创建form2
时,然后传递给它form1
实例(作为构造函数参数或通过设置公共属性),以便能够调用form1
。
作为一种快速但相对 legimate 的解决方案,请使用此方法static
:
private static Form1 _instance;
public Form1()
{
InitializeComponents();
_instance = this;
}
public static void MasterReset()
{
// alot of code
_instance.listView1.Clear();
// alot of code
}
通过这种方式,您可以通过此MasterReset
之类的任何其他表单来呼叫Form1.MasterReset()
。这种方法的缺点是你不能拥有多个form2
的实例(无论如何更有可能)。
答案 3 :(得分:2)
namespace F1
{
// Method defined in this class
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//This method I would like to call in other form
public void function()
{
MessageBox.Show("Invoked");
}
// opening the new form using button click
private void OpenNewForm_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.ShowDialog();
}
}
// This is second form
public partial class Form2: Form
{
public Form2()
{
InitializeComponent();
}
// on button click Form1 method will be called
private void button1_Click(object sender, EventArgs e)
{
var mainForm = Application.OpenForms.OfType<Form1>().Single();
mainForm.function();
}
}
}
答案 4 :(得分:0)
我理解你的问题,你可以将你的函数声明为public static void(也是listView1,人也应该是静态的)。然后当你想这样打电话时:
private void btn_MasterReset_Click(object sender, EventArgs e)
{
Main.MasterReset();
}