我正在创建一个多标签的.NET应用程序,允许用户在运行时动态添加和删除标签。添加新选项卡时,会向其添加一个控件(作为子项),其中可以编辑内容(例如,文本框)。用户可以使用工具栏/菜单栏在当前可见的文本框上执行任务。
为了更好地解释这一点,请查看下面的图片以查看我想要完成的示例。它只是一个模型,所以它实际上并没有那样工作,但它显示了我想要完成的任务。基本上,就像一个多标签的记事本。
在此处查看图片:http://picasion.com/pic15/324b466729e42a74b9632c1473355d3b.gif
这在.NET中可行吗?我很确定它是,我只是想找到一种可以实现的方式。
答案 0 :(得分:0)
我建议你更新一些“当前状态”变量,这样你总是有一个指向所选标签页及其子控件的指针(在这里讨论的标签式记事本模拟的情况下:一个TextBox)。我的偏好是使用Dictionary来跟踪TabPage<> TextBox连接,以避免在使用TabPage.Controls路径访问它们时必须转换TextBox:以下代码假定您在窗体上有一个名为'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。
最好,比尔
答案 1 :(得分: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;
};
}
答案 2 :(得分: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();