2

これまでの私の人生では、.net開発者として、mdiフォームを多用して、たとえば「モジュール1」、「モジュール2」などの特定の「メニューポイント」を表示してきました。

私はこれを次のように行っています:

  • 「isMdiContainer」を「true」に設定して親フォームを作成します
  • mdiコンテナにメニューストリップを作成します
  • フォームが1回だけ表示されるように、シングルトンを実装する子フォームを作成します
  • 次のコードのようなものをmdiコンテナに追加します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Myapp
{

public partial class MdiContainer : Form
{
    private module1 Module1Window;
    private module2 Module2Window;
    private module3 Module3Window;

    public FormContainer()
    {
        InitializeComponent();
        this.Module1Window = modul1.getInstance();
        this.Module1Window.MdiParent = this;
        this.Module2Window = modul2.getInstance();
        this.Module2Window.MdiParent = this;
        this.Module3Window = modul3.getInstance();
        this.Module3Window.MdiParent = this;
        this.Module1Window.Show();
    }
    private void module1ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Module3Window.Hide();
        this.Module2Window.Hide();
        this.Module1Window.Show();
    }       
    private void module2ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Module1Window.Hide();
        this.Module3Window.Hide();
        this.Module2Window.Show();
    }
    private void module3ToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Module1Window.Hide();
        this.Module2Window.Hide();
        this.Module3Window.Show();
    }
}

}

さて、これは明らかにうまくいきます。しかし、維持するのは苦痛です。別の子フォームを追加するたびに、次のことを行う必要があります。

  • シングルトンを実装する
  • mdiコンテナに対応するプロパティを作成します
  • インスタンスを取得し、mdiの親を設定します
  • 他のボタンがクリックされたときに新しいフォームを非表示にする
  • 対応するボタンがクリックされたときにフォームを表示し、他のすべてのフォームを非表示にします

これをアーカイブするためのよりエレガントな、または効率的なアプローチを言うことができますか?

4

1 に答える 1

1

メニュー項目はいつ作成しますか?これらは子フォームとともに動的に作成されますか?

その場合は、フォームを作成してリストに追加し、メニュー項目のTagプロパティをフォームに割り当てます。すべてのメニュー項目のクリックイベントを同じハンドラーに割り当て、ハンドラー内でこれを行います...

private void menuStrip_Click(object sender, EventArgs e)
{
    var menu = (ToolStripItem)sender;
    var viewForm = (Form)sender.Tag;
    foreach(Form childForm in _childForms)
        childForm.Hide();
    viewForm.Show();
}

これと同じハンドラーは、フォームの数に関係なく使用できます。

または、タグとしてキーをDictionary<string, Form>使用し、フォームをより遅延的に作成できるようにすることもできますが、概念は同じです。

于 2010-07-21T11:10:45.827 に答える