1

ユーザーが実行時にタブを動的に追加および削除できるようにするマルチタブの.NETアプリケーションを作成しています。新しいタブが追加されると、そのタブに(子として)コントロールが追加され、コンテンツを編集できます(テキストボックスなど)。ユーザーは、ツールバー/メニューバーを使用して、現在表示されているテキストボックスでタスクを実行できます。

これをよりよく説明するために、下の写真を見て、私が達成したいことの例を見てください。これは単なるモックアップなので、実際にはそのようには機能しませんが、私がやりたいことを示しています。基本的に、マルチタブのメモ帳のように。

ここで画像を表示します:http://picasion.com/pic15/324b466729e42a74b9632c1473355d3b.gif

これは.NETで可能ですか?私はそれが正しいと確信しています、私はそれを実装できる方法を探しています。

4

3 に答える 3

0

いくつかの「現在の状態」変数を更新しておくことをお勧めします。これにより、選択したタブページへのポインターとその子コントロール(ここで説明するタブ付きメモ帳エミュレーションの場合:TextBox)を常に使用できます。私の好みは、辞書を使用して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にのみ適用されるようになりました。

最高、ビル

于 2009-11-17T05:30:47.793 に答える
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 に答える