2009-11-17 106 views
1

我創建了一個多選項卡的.NET應用程序,允許用戶在運行時動態添加和刪除選項卡。添加新選項卡時,會向其添加控件(作爲子項),其中可以編輯內容(例如文本框)。用戶可以使用工具欄/菜單欄在當前可見的文本框上執行任務。多選項卡應用程序(C#)

爲了更好地解釋這一點,看看下面的圖片中看到的就是我要完成的例子。這只是一個模擬,所以它實際上並不是那樣工作,但它顯示了我想要完成的事情。本質上,就像一個多標籤的記事本。

這裏觀看圖片:http://picasion.com/pic15/324b466729e42a74b9632c1473355d3b.gif

這是可能的.NET?我很確定,我只是在尋找一種可以實施的方式。

回答

0

你可以使用一個簡單的擴展方法:

public static void PasteIntoCurrentTab(this TabControl tabControl) 
    { 
     if (tabControl.SelectedTab == null) 
     { 
      // Could throw here. 
      return; 
     } 

     if (tabControl.SelectedTab.Controls.Count == 0) 
     { 
      // Could throw here. 
      return; 
     } 

     RichTextBox textBox = tabControl.SelectedTab.Controls[0] as RichTextBox; 
     if (textBox == null) 
     { 
      // Could throw here. 
      return; 
     } 

     textBox.Paste();      
    } 

用法:

myTabControl.PasteIntoCurrentTab(); 
+0

我只使用你的代碼的第15行,tabControl.SelectedTab.Controls [0](獲得正確的控制)是我所需要的。完美(現在)。謝謝(對你和其他人)。 – Zach 2009-11-17 22:09:44

0

是的,這個問題已經been answered here它看起來像你問同樣的事情。

+0

是的,我有做過,但我真正想要的是讓工具欄上的項目僅在單擊時與當前選定選項卡上的控件相關聯。選項卡和控件僅在運行時創建。 以一個multitab記事本爲例:我已經想通了如何創建選項卡,並添加控件,所有在運行時,但我想編輯 - >粘貼功能正常工作,即。粘貼到當前選定的文本區域。希望我解釋得很好。 – Zach 2009-11-17 01:54:36

0

我建議你及時更新一些「當前狀態」變量,所以你總是有一個指針到所選標籤頁,它的子控件(在這裏討論一個標籤,記事本仿真的情況下:一個TextBox)。我更傾向於將保留的TabPage <的軌道>使用字典,以避免投的文本框,如果他們使用的是TabPage.Controls路徑訪問文本框的連接:下面的代碼假定你有一個名爲「tabControl1在窗體上的TabControl:

Dictionary<TabPage, TextBox> dct_TabPageToTextBox; 

int tabCnt = 1; 

TabPage currentTabPage; 

TextBox currentTextBox; 

因此,當你在運行時創建的每個新的TabPage調用是這樣的:

private void AddNewTabPage() 
    { 
     if (dct_TabPageToTextBox == null) dct_TabPageToTextBox = new Dictionary<TabPage, TextBox>(); 

     currentTabPage = new TabPage("Page " + tabCnt.ToString()); 
     tabControl1.TabPages.Add(currentTabPage); 

     currentTextBox = new TextBox(); 

     dct_TabPageToTextBox.Add(currentTabPage, currentTextBox); 

     currentTabPage.Controls.Add(currentTextBox); 
     currentTextBox.Dock = DockStyle.Fill; 

     currentTextBox.Text = "sample text for page " + tabCnt.ToString(); 

     tabControl1.SelectedTab = currentTabPage; 
     tabCnt++; 
    } 

由於最終用戶更改所選的TabPage你可以簡單地更新當前的狀態變量,如這個:

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    currentTabPage = tabControl1.SelectedTab; 
    currentTextBox = dct_TabPageToTextBox[currentTabPage]; 

    MessageBox.Show("text in current Tab Page is : " + currentTextBox.Text); 
} 

所以,現在有一個由只適用於currentTextBox你的菜單選項調用的代碼。

最好,比爾

0

我想以此爲樂......我犯了一個形式與ToolStripContainer和ToolStrip的裏面,與標準按鈕(包括粘貼按鈕)。我改名粘貼按鈕pasteButton,以及掛鉤的一切,您會獲得:

public Form2() 
    { 
     InitializeComponent(); 

     TabControl tc = new TabControl(); 
     toolStripContainer1.ContentPanel.Controls.Add(tc); 
     tc.Dock = DockStyle.Fill; 

     TextBox selectedTextBox = null; 

     pasteButton.Click += (_, __) => selectedTextBox.Paste(Clipboard.GetText(TextDataFormat.Text)); 

     int pages = 0; 

     newTabButton.Click += (_,__) => {     
      TextBox tb = new TextBox { Multiline = true, Dock = DockStyle.Fill, ScrollBars = ScrollBars.Vertical }; 
      TabPage tp = new TabPage("Page " + (++pages).ToString());     
      tc.Selected += (o, e) => selectedTextBox = e.TabPage == tp ? tb: selectedTextBox; 
      tp.Controls.Add(tb); 
      tc.TabPages.Add(tp); 
      tc.SelectedTab = tp; 
      selectedTextBox = tb; 
     };   

    } 
相關問題