1

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

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

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

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

4

3 回答 3

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

    }
于 2009-11-17T07:36:55.803 回答
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();
于 2009-11-17T14:28:19.020 回答
0

我建议您更新一些“当前状态”变量,以便始终拥有指向所选选项卡页及其子控件的指针(在此处讨论的选项卡式记事本模拟的情况下:文本框)。我的偏好是使用 Dictionary 跟踪 TabPage<>TextBox 连接,以避免在使用 TabPage.Controls 路由访问它们时强制转换 TextBox:以下代码假设您在 Form 上有一个名为 '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。

最好的,比尔

于 2009-11-17T05:30:47.793 回答