如何从另一种形式调用函数

问题描述 投票:4回答:4

在我的项目中,我有一个设置表单和一个主表单。我试图从设置表单中调用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();
}

为什么我没有看到任何结果?

c# void
4个回答
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

10
投票

你知道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();
} 

希望这可以帮助!


3
投票

有多种解决方案可行。但问题本身来自糟糕的设计。如果你需要被许多人访问,那为什么它应该属于某人?但是,如果您想要通知任何事情,那么请使用事件。

你的错误是你正在创建qazxsw poi的另一个实例,这个qazxsw poi正在使用form运行,甚至没有显示。

你可以做什么:

  1. 让(如Ravshanjon建议的)一个单独的类来处理form1(也许还有别的东西)。但也加入了一个事件。 MasterResetMasterReset都可以订阅它,只要他们中的任何一个调用form1 - 两者都会做出反应。
  2. 创建表单依赖项(如BRAHIM Kamel建议的那样):当您创建form2时,然后传递给它MasterReset实例(作为构造函数参数或通过设置公共属性),以便能够调用form2的公共非静态方法。
  3. 作为一个快速,但相对合法的解决方案,使这个方法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实例(无论如何更有可能)。


0
投票

我理解你的问题,你可以将你的函数声明为public static void(也是listView1,人也应该是静态的)。然后,当你想打电话给这样:

Form1.MasterReset()
© www.soinside.com 2019 - 2024. All rights reserved.