在我的项目中,我有一个设置表单和一个主表单。我试图从设置表单中调用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();
}
为什么我没有看到任何结果?
这对我有用:在你的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
你知道composition over inheritance是什么吗?
在你有MasterReset
的形式,你应该做这样的事情:
让我们假设在你的第二种形式中你有这样的东西,让我们假设你的“winform”将被称为“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();
}
希望这可以帮助!
有多种解决方案可行。但问题本身来自糟糕的设计。如果你需要被许多人访问,那为什么它应该属于某人?但是,如果您想要通知任何事情,那么请使用事件。
你的错误是你正在创建qazxsw poi的另一个实例,这个qazxsw poi正在使用form运行,甚至没有显示。
你可以做什么:
form1
(也许还有别的东西)。但也加入了一个事件。 MasterReset
和MasterReset
都可以订阅它,只要他们中的任何一个调用form1
- 两者都会做出反应。form2
时,然后传递给它MasterReset
实例(作为构造函数参数或通过设置公共属性),以便能够调用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
}
。这种方法的缺点是你不能拥有多个MasterReset
实例(无论如何更有可能)。
我理解你的问题,你可以将你的函数声明为public static void(也是listView1,人也应该是静态的)。然后,当你想打电话给这样:
Form1.MasterReset()