多标签应用程序(C#)

时间:2009-11-17 01:42:43

标签: c# .net tabcontrol tabs tabpage

我正在创建一个多标签的.NET应用程序,允许用户在运行时动态添加和删除标签。添加新选项卡时,会向其添加一个控件(作为子项),其中可以编辑内容(例如,文本框)。用户可以使用工具栏/菜单栏在当前可见的文本框上执行任务。

为了更好地解释这一点,请查看下面的图片以查看我想要完成的示例。它只是一个模型,所以它实际上并没有那样工作,但它显示了我想要完成的任务。基本上,就像一个多标签的记事本。

在此处查看图片:http://picasion.com/pic15/324b466729e42a74b9632c1473355d3b.gif

这在.NET中可行吗?我很确定它是,我只是想找到一种可以实现的方式。

3 个答案:

答案 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();