多选项卡应用程序(C#)

多选项卡应用程序(C#),c#,.net,tabcontrol,tabs,tabpage,C#,.net,Tabcontrol,Tabs,Tabpage,我正在创建一个多选项卡的.NET应用程序,允许用户在运行时动态添加和删除选项卡。添加新选项卡时,会向其添加一个控件(作为子控件),可以在其中编辑内容(例如文本框)。用户可以使用工具栏/菜单栏在当前可见的文本框上执行任务 为了更好地解释这一点,请看下面的图片,看看我想要实现的一个示例。这只是一个模型,所以它实际上不是这样工作的,但它显示了我想要完成的事情。本质上,就像一个多标签记事本 在此处查看图像: 这在.NET中可能吗?我很确定,我只是在寻找一种可以实现它的方法。我建议您更新一些“当前状态”变

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

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

在此处查看图像:

这在.NET中可能吗?我很确定,我只是在寻找一种可以实现它的方法。

我建议您更新一些“当前状态”变量,以便始终有一个指向所选选项卡页面及其子控件的指针(在这里讨论的选项卡式记事本模拟的情况下:文本框)。我的首选是使用字典跟踪TabPageTextBox连接,以避免在使用TabPage访问文本框时强制转换文本框。控件路由:以下代码假定表单上有一个名为“tabControl1”的TabControl:

Dictionary<TabPage, TextBox> dct_TabPageToTextBox;

int tabCnt = 1;

TabPage currentTabPage;

TextBox currentTextBox;
现在,让菜单选项调用的代码仅应用于currentTextBox


最好的,比尔,我试了这个是为了好玩。。。我制作了一个带有ToolStripContainer的表单,其中有一个ToolStrip,带有标准按钮(包括粘贴按钮)。我将“粘贴”按钮重命名为“粘贴”按钮,并将您获得的所有内容连接起来:

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;
        };           

    }

您可以使用一种简单的扩展方法:

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

我只使用了代码的第15行,tabControl.SelectedTab.Controls[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();