2017-08-12 60 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個選項卡。

上午我在正確的方向,如果是這樣,我怎麼解決這個實例的情況呢?

我想無論是處置時不再是活動..或者當一個已經打開有點不創建一個新的實例?

第二問題

之一形式需要約2秒至打開(它是示出基於SQL的圖表)。我怎樣才能加載這個頁面在標籤中,當我打開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(); 

(添加的可見部分),然後我做到了再次可見選擇的選項卡時,但似乎它仍然需要幾秒鐘,並沒有真正工作的權利。

+0

的啓動時間?它是否不像你預期的那樣行事,是不是編譯? –

+1

@YvetteColomb它編譯,但是當他們打開更多的情況下,該進程的內存每一次上升。這顯然不是'好技術',所以我正在學習如何變得更聰明:) –

回答

0

如果你想你的表格只有一個實例打開,那麼你應該檢查Application.OpenForms集合,如果你的形式之一已經由系統

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; 

通知所涉及那裏,如果你離開了這個工程將表單的名稱屬性設置爲其默認名稱(與表單的類名稱相同)

您還可以嘗試在每個表單的單獨方法中分隔關於打開表單的邏輯,並實現一個字典,您在其中存儲該表單鍵和當用戶選擇該特定標籤時執行的動作

// 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

謝謝,我喜歡這個方法的想法,似乎有點清潔? –

相關問題