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

时间:2013-11-29 12:45:21

标签: c# void

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

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

5 个答案:

答案 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正在使用表单进行操作,甚至没有显示。

你能做什么:

  1. 让(如Ravshanjon所建议的)一个单独的类来处理MasterReset(也许还有别的东西)。但也加入了一个事件。 form1form2都可以订阅,只要其中任何一个调用MasterReset - 两者都做出反应

  2. 创建表单依赖项(如BRAHIM Kamel建议的那样):当您创建form2时,然后传递给它form1实例(作为构造函数参数或通过设置公共属性),以便能够调用form1

  3. 的公共非静态方法
  4. 作为一种快速但相对 legimate 的解决方案,请使用此方法static


  5. 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();
}