2017-08-12 8 views
1

私はC#を初めて使用し、基本的なプログラムを作成しました。タブ付きメニュー - 各タブは別々のCSファイルとして

私の "メインメニュー"は、7つのタブが上に並んで設定されています。 私はCASEを設定しているので、ユーザーがタブを選択すると、その特定のサブメニュー(frmXXXmenu)がコントロールに追加されます。

問題が

  1. ので、私は、フォームの生成インスタンスを保持、今各フォームのクリックを開きます。この正しい
  2. です(と私は私のプロセスメモリを増やす見ることができます!)

    です
    private void tabmain_SelectedIndexChanged(object sender, EventArgs e) 
    { 
        string curtab = tabmain.SelectedTab.Name.ToString(); 
        switch (tabmain.SelectedTab.Name) 
        { 
         case "tabcollect": 
          frmcollectmenu frmcollectmenu = new frmcollectmenu(); 
          frmcollectmenu.TopLevel = false; 
          tabcollect.Controls.Add(frmcollectmenu); 
          frmcollectmenu.Dock = DockStyle.Fill; 
          frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
          frmcollectmenu.Show(); 
          break; 
         case "tabpack": 
          frmpackmenu frmpackmenu = new frmpackmenu(); 
          frmpackmenu.TopLevel = false; 
          tabpack.Controls.Add(frmpackmenu); 
          frmpackmenu.Dock = DockStyle.Fill; 
          frmpackmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
          frmpackmenu.Show(); 
          break; 
    
    
        } 
    } 
    

その他7個のタブ。

私は正しい方向にありますか?そうであれば、このインスタンスの状況をどのように修正しますか?

私は、もうアクティブでなくなったときに廃棄するか、すでに開いているときに新しいインスタンスを作成しないと思っていましたか?フォームの

第二の問題

一つは、(それがSQLに基づいてチャートを示している)を開くのに約2秒かかります。プログラムを起動するためにfrmmain()を開いたときにタブにこのページを読み込むことができます。その後、タブを開くとロードされますか? は私が(目に見える部分を追加)

frmcollectmenu frmcollectmenu = new frmcollectmenu(); 
    frmcollectmenu.TopLevel = false; 
    tabcollect.Controls.Add(frmcollectmenu); 
    frmcollectmenu.Dock = DockStyle.Fill; 
    frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
frmcollectmenu.visible = false; 
frmcollectmenu.Show(); 

を入れてみました、タブを選択するときに、私は再びそれが見えるようになるが、それはまだ数秒とdoesntのは本当に正しい仕事かかるようです。

+0

の起動時に構築した辞書から適切な行動を選択しますか?期待どおりに動作しないのですか?コンパイルしていませんか? –

+1

@YvetteColombはコンパイルしていますが、より多くのインスタンスを開くと、毎回プロセスメモリが増加します。これは明らかに「良いテクニック」ではないので、私はそれについてより賢くなる方法を学んでいます:) –

答えて

0

あなたのフォームのインスタンスが1つだけあなたのいずれかの形式がすでにシステムであり、あなたが去るならば、これが機能することを

case "tabcollect": 
    frmcollectmenu f = Application.OpenForms["frmcollectmenu"]; 
    if(f == null) 
    { 
     frmcollectmenu frmcollectmenu = new frmcollectmenu(); 
     frmcollectmenu.TopLevel = false; 
     tabcollect.Controls.Add(frmcollectmenu); 
     frmcollectmenu.Dock = DockStyle.Fill; 
     frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
     frmcollectmenu.Show(); 
    } 
    else 
     f.Show(); 
    break; 

お知らせを参照されている場合は、Application.OpenFormsコレクションをチェックする必要があり、その後開かれた場合フォームの名前プロパティ(フォームのクラス名と同じ)

開いているフォームのロジックをフォームごとに別々のメソッドで分離し、タブを格納する辞書を実装することもできますキーとその特定のタブを選択したときに実行するアクション

// At form global level.... 
    Dictionary<string, Action> tabActions = new Dictionary<string, Action>() 
    { 
    { "tabCollect", runCollect }, 
    { .....     }, 
     so on for other tabs 
    } 

    // The logic for a particular form (the same are needed for others forms) 
    private static void runCollect() 
    { 
    frmcollectmenu f = Application.OpenForms["frmcollectmenu"]; 
    if(f == null) 
    { 
     frmcollectmenu frmcollectmenu = new frmcollectmenu(); 
     frmcollectmenu.TopLevel = false; 
     tabcollect.Controls.Add(frmcollectmenu); 
     frmcollectmenu.Dock = DockStyle.Fill; 
     frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
     frmcollectmenu.Show(); 
    } 
    else 
     f.Show(); 
    } 

今すぐあなたのSelectedIndexChanged方法でスイッチを削除することができますし、単に静的プログラムがやっている何をあなたのメインフォーム

private void tabmain_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    string curtab = tabmain.SelectedTab.Name.ToString(); 
    if(tabActions.ContainsKey(curTab)) 
     tabActions[curTab].Invoke(); 
} 
+0

それでは、私は、b、c、d、e、 ケースが始まる前に置く方法はありませんか? "Form open = Application.OpenForms [openfrm];"または何か、次にopenfrm = Application.OpenForms ["frmcollectmenu"]; –

+0

スイッチの後でのみチェックするフォームを知っています。キーがタブ名であり、値が特定のフォームを作成または再表示するために必要な特定のコードを実行する関数代理人である辞書を作成できます。しかし、私はそれが本当に大きな違いだとは思わない。 – Steve

+0

ありがとう私は方法のアイデアが好き、少しきれいに見えますか? –

関連する問題