2009-11-17 103 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; 
     };   

    } 
相关问题