19

私のシナリオは次のとおりです。

私は、クリックされるたびに別のタブページを生成するタブコントロールのメインページ内にボタンがあるC#のwinformsアプリケーションに取り組んでいます。新しい各タブページには、ユーザーコントロールによって定義されたレイアウトが含まれます。

私の質問は次のとおりです。

  1. 実行時に動的に作成されたタブの1つをユーザーが閉じることができるようにするにはどうすればよいですか?

  2. 特定のタブを閉じるためにユーザーがクリックできる各タブに小さな「X」が含まれるように、タブコントロール自体を変更するにはどうすればよいですか?(Firefoxのように)

  3. 代わりにユーザーコントロール内のボタンでタブを閉じたい場合、タブコントロールのSelectedIndexプロパティをユーザーコントロールに公開するにはどうすればよいですか?

4

7 に答える 7

14

私はこのコードを見つけて、私にとって非常に役に立ちました:

private void tabControl_MouseUp(object sender, MouseEventArgs e)
{
    // check if the right mouse button was pressed
    if(e.Button == MouseButtons.Right)
    {
        // iterate through all the tab pages
        for(int i = 0; i < tabControl1.TabCount; i++)
        {
            // get their rectangle area and check if it contains the mouse cursor
            Rectangle r = tabControl1.GetTabRect(i);
            if (r.Contains(e.Location))
            {
                // show the context menu here
                System.Diagnostics.Debug.WriteLine("TabPressed: " + i);
             }
        }
    }
}

TabControl:マウスをキャプチャする方法タブを右クリック

于 2010-11-25T18:05:21.960 に答える
10

約1年前に派生タブコントロールを作成しました。ソースはここに投稿しません。これは、長さが約700行で、コーディングが非常に面倒だからです。たぶん、コードをクリーンアップして、ここでリリースする時間を見つけるでしょう。今のところ、それが構築される方法の概要を簡単に説明します。

各タブページには、タイトルの左側に「X」アイコンがあり、タブページは、ドラッグアンドドロップによる並べ替えと、複数のタブコントロール間での移動をサポートしています。

タブページにアイコンを表示する簡単な方法を選択します。タブコントロールにはTabControl.ImageListプロパティがあり、タブページにはTabPage.ImageIndexプロパティがあります。そこで、画像リストに3つのアイコン(通常、ホバー、押された)を追加し、マウスイベントを処理しました。

マウスが特定のタブページの上にあるかどうかをテストし、いくつTabControl.GetTabRect()かの計算でアイコンの上にあるかどうかを確認できます。次に、マウスボタンの状態に応じてアイコンを変更し、ボタンが押された場合は最終的にマウスの下のタブページを削除する必要があります。

このソリューションの主な問題は、マウスがアイコンの上にあるかどうかを計算するには、タブページに対してアイコンがどこにペイントされているかを知る必要があり、これは新しいWindowsバージョンで変わる可能性があることです。アイコンはタイトルの左側にありますが、それほど悪くはありません。

于 2009-04-29T18:38:00.130 に答える
6

私は次のことを行いました:作成(追加)TabPage段階で、toolStrip

ToolStrip ts = new ToolStrip();
ts.Dock = DockStyle.Top;
ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes;

次に、Xボタンを作成してに追加しますtoolstrip

ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);

Xボタンをクリックしてイベントを作成する

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

toolstripに追加tabpage

tabControl1.TabPages[curenttabpage].Controls.Add(ts);

のところToolStripButton_Clickは次のとおりです。

void ToolStripButton_Click(object sender, EventArgs e)
{ 
 ToolStripButton t = (ToolStripButton)(sender);
 ToolStrip ts = t.Owner;
 TabPage tb = (TabPage)
 (ts.Parent);tabControl1.TabPages.Remove(tb);
}

多分それはあなたが望むようではありませんが、それはうまくいくでしょう。

于 2012-05-24T22:07:47.140 に答える
2

同様の設定を作成しました。

実行時にタブページに追加される各コントロールは、私が作成した特別な基本コントロールから派生しています。この基本コントロールには、閉じるボタンがあります(フラグを安全に閉じるなどの他の機能とともに)。

ベースコントロールで使用しているタブコードを閉じます。

 TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;

tabControl.TabPages.Remove(parent);
于 2009-04-29T19:53:29.980 に答える
1

これが古いスレッドであることは知っていますが、配列内のタブを「非表示」にして、実行時に必要なタブを再ロードできるこのリンクを見つけました。簡単に見つけられる場所にこれを追加しました。

于 2011-09-22T00:00:24.263 に答える
0

このコードは、マウスの中クリックでタブコントロールを閉じるのに役立つ場合があります。

            private void tabControl1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button != System.Windows.Forms.MouseButtons.Middle)
                    return;

                for (int i = 0; i < MainTabControl.TabPages.Count; i++)
                {
                    if (this.MainTabControl.GetTabRect(i).Contains(e.Location))
                    {
                        this.MainTabControl.TabPages.RemoveAt(i);
                        return;
                    }
                }
            }
于 2015-08-07T08:04:26.317 に答える
-3

それはうまくいきます!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
于 2015-04-24T21:06:25.273 に答える