C# 从另一个表单c调用方法#

C# 从另一个表单c调用方法#,c#,winforms,C#,Winforms,我有这样一个主窗体: public partial class MainForm : Form { string FileName = ""; public MainForm() { InitializeComponent(); } private void goToToolStripMenuItem_Click(object sender, EventArgs e) { } private void men

我有这样一个主窗体:

public partial class MainForm : Form
{
    string FileName = "";

    public MainForm()
    {
        InitializeComponent();
    }

    private void goToToolStripMenuItem_Click(object sender, EventArgs e)
    {

    }

    private void menuItem_Click(object sender, EventArgs e)
    {
        ToolStripMenuItem menuItem = (ToolStripMenuItem ) sender;

        switch (menuItem.Name.Replace("ToolStripMenuItem",""))
        {
            case "new":
                MenuItemNew();
                break; 
            case "open" :
                MenuItemOpen();
                break;
            case "save":
                MenuItemSave();
                break;
            case "saveAs" :
                MenuItemSaveAs();
                break;
          case "exit" :
                MenuItemExit();
                break;
            case "selectAll" :
                MenuItemSelectAll();
                break;
        }
    }

    private void MenuItemSelectAll()
    {
        textBox.SelectAll();
    }

    private void MenuItemExit()
    {
        this.Close();
    }

    private void MenuItemSaveAs()
    {
        SaveFileDialog sfd = new SaveFileDialog();
        sfd.Filter = "Text Document |*.txt";
        if (sfd.ShowDialog() == DialogResult.OK)
        {
            StreamWriter writer = new StreamWriter(sfd.FileName);
            writer.Write(textBox.Text);
            writer.Close();
        }
    }

    private void MenuItemSave()
    {
        if (FileName == "")
        {
            MenuItemSaveAs();
        }
        else
        {
            StreamWriter writer = new StreamWriter(FileName);
            writer.Write(textBox.Text);
            writer.Close();
        }
    }

    private void MenuItemOpen()
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "Text Document|*.txt";
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            FileName = ofd.FileName;
            StreamReader reader = new StreamReader(ofd.FileName);
            textBox.Text = reader.ReadToEnd();
            reader.Close();
        }
    }

    private void MenuItemNew()
    {
        if (textBox.Text == "")
        {
            textBox.Text = String.Empty;
        }
        else
            this.Show();
            Newform sistema=new Newform();
        sistema.ShowDialog();
    }
}
public partial class Newform : Form
{
    public Newform()
    {
        InitializeComponent();
    }

    private void cancel_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void dontsave_click(object sender, EventArgs e)
    {

    }

    private void save_Click(object sender, EventArgs e)
    {
        this.Hide();
    }
}
还有这样一种新形式:

public partial class MainForm : Form
{
    string FileName = "";

    public MainForm()
    {
        InitializeComponent();
    }

    private void goToToolStripMenuItem_Click(object sender, EventArgs e)
    {

    }

    private void menuItem_Click(object sender, EventArgs e)
    {
        ToolStripMenuItem menuItem = (ToolStripMenuItem ) sender;

        switch (menuItem.Name.Replace("ToolStripMenuItem",""))
        {
            case "new":
                MenuItemNew();
                break; 
            case "open" :
                MenuItemOpen();
                break;
            case "save":
                MenuItemSave();
                break;
            case "saveAs" :
                MenuItemSaveAs();
                break;
          case "exit" :
                MenuItemExit();
                break;
            case "selectAll" :
                MenuItemSelectAll();
                break;
        }
    }

    private void MenuItemSelectAll()
    {
        textBox.SelectAll();
    }

    private void MenuItemExit()
    {
        this.Close();
    }

    private void MenuItemSaveAs()
    {
        SaveFileDialog sfd = new SaveFileDialog();
        sfd.Filter = "Text Document |*.txt";
        if (sfd.ShowDialog() == DialogResult.OK)
        {
            StreamWriter writer = new StreamWriter(sfd.FileName);
            writer.Write(textBox.Text);
            writer.Close();
        }
    }

    private void MenuItemSave()
    {
        if (FileName == "")
        {
            MenuItemSaveAs();
        }
        else
        {
            StreamWriter writer = new StreamWriter(FileName);
            writer.Write(textBox.Text);
            writer.Close();
        }
    }

    private void MenuItemOpen()
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "Text Document|*.txt";
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            FileName = ofd.FileName;
            StreamReader reader = new StreamReader(ofd.FileName);
            textBox.Text = reader.ReadToEnd();
            reader.Close();
        }
    }

    private void MenuItemNew()
    {
        if (textBox.Text == "")
        {
            textBox.Text = String.Empty;
        }
        else
            this.Show();
            Newform sistema=new Newform();
        sistema.ShowDialog();
    }
}
public partial class Newform : Form
{
    public Newform()
    {
        InitializeComponent();
    }

    private void cancel_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void dontsave_click(object sender, EventArgs e)
    {

    }

    private void save_Click(object sender, EventArgs e)
    {
        this.Hide();
    }
}
在新表单中单击“保存”时,我需要在主表单中打开菜单项SaveAs。

首先

 public void MenuItemSaveAs()
然后


这假设您的表单是MainForm的子级。如果不是,则需要将对MainForm的引用传递到表单的构造函数中,并将其保存在本地。(还有一种方法可以始终找到当前节目的主要形式,但我认为这不是解决问题的优雅方法。)

Melody,问题其实在于设计。表单不应调用其他表单中的GUI元素。这可能导致极难维护的“意大利面”代码。如果它是你试图以这种方式操纵的主要形式,你可以相信它存在,但它仍然违反了最佳实践。如果您试图以这种方式操纵其他表单,则必须处理表单不存在(尚未创建或已被处置)的可能性


如果代码需要操作表单的GUI,那么所说的代码应该在表单中。

你能告诉我问题出在哪里吗?我想这是你应该告诉我和其他人的,而不是我:)这可能会有帮助,@Hogan,但问题很简单,不需要在谷歌上搜索,自从4个月前我如此频繁地注册和使用以来,这样的问题已经被问了至少几十次了。(这是我读过的,不是全部)。@KingKing-然后你应该单击close并标记为replicate,用指针指向其他地方的同一个问题。对提出问题的人下流不是一件好事——想象一下,如果你不知道这一点,却在问一个问题。另外,确保它是一个dup——例如,Angus的dup指针不是同一个问题context@MelodyHajian-请使用
P
而不是
P
-大写。请注意,这是
C
,而不是
C++
错误的记事本。MainForm.MenuItemSaveAs()“由于其保护,无法访问level@MelodyHajian您需要将该方法公开:
public void MenuItemSaveAs()
虽然这都是事实,但这并不能为如何不违反这些原则提供答案。