【问题标题】:calling a method from another form c#从另一个表单c#调用方法
【发布时间】:2013-11-15 17:29:33
【问题描述】:

我有一个这样的主窗体:

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

当在我的新表单中单击保存时,我需要 MenuItemSaveAs 在我的主表单中打开。

【问题讨论】:

  • 你能告诉我有什么问题吗?
  • 我认为你应该告诉我和其他人,而不是我 :)
  • 这可能会有所帮助,stackoverflow.com/questions/12469423/…
  • @Hogan 但这个问题很基础,不需要在谷歌上搜索,自从我注册 SO 以来,这样的问题已被问过至少几十次 4个月前经常使用SO。 (这是我读过的,不是全部)。
  • @KingKing - 然后您应该单击关闭并使用指向其他地方相同问题的指针标记为重复。对提出问题的人感到讨厌并不是一件好事——想象一下,如果你不知道 SO 并且正在问一个问题。另外,请确保它是一个 dup——例如,安格斯的 dup 指针不是同一个问题。

标签: c# winforms


【解决方案1】:

第一

 public void MenuItemSaveAs()

然后

private void save_Click(object sender, EventArgs e)
{
    this.Hide();   
    ((MainForm)Parent).MenuItemSaveAs()
}

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

【讨论】:

  • 错误当前上下文中不存在名称'父'
  • @MelodyHajian - 请使用P 而不是p - 大写很重要。
  • 注意,这是C#,而不是C++
  • 错误 'Notepad.MainForm.MenuItemSaveAs()' 由于其保护级别而无法访问
  • @MelodyHajian 您需要公开该方法:public void MenuItemSaveAs()
【解决方案2】:

Melody,问题出在设计上。一个窗体不应调用另一个窗体中的 GUI 元素。这可能导致极难维护的“意大利面条”代码。如果它是您试图以这种方式操纵的主要形式,您可以依赖它存在,但这仍然违反了最佳实践。如果您要尝试以这种方式操作其他表单,您将不得不处理该表单不存在(尚未创建或已被处置)的可能性。

如果代码需要操作表单的 GUI,则所述代码应在该表单内。

【讨论】:

  • 虽然这一切都是正确的,但这并不能说明如何应该做到违反这些原则。
猜你喜欢
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2020-10-20
  • 2014-01-31
相关资源
最近更新 更多