タブコントロールのメインページ内に、クリックするたびに別のタブページを生成するボタンがあるC#のwinformsアプリケーションに取り組んでいます。新しい各タブページには、ユーザーコントロールによって定義されたレイアウトが含まれます。
実行時に動的に作成されたタブの1つをユーザーが閉じられるようにするにはどうすればよいですか?
ユーザーが特定のタブを閉じるためにクリックできる各タブに小さな「X」が含まれるように、タブコントロール自体を変更するにはどうすればよいですか? (Firefoxのように)
代わりにユーザーコントロール内のボタンでタブを閉じたい場合、ユーザーコントロールにtabcontrolのSelectedIndexプロパティを公開するにはどうすればよいですか?
約1年前に派生タブコントロールを作成しました。ここにはソースを投稿しません。これは、約700行の長さであり、コードがかなり乱雑にコーディングされているためです。たぶん、コードをクリーンアップして、ここでリリースする時間が見つかるかもしれません。とりあえず、ビルド方法の概要を簡単に説明します。
各タブページには、タイトルのleftに「X」アイコンがあり、タブページは、ドラッグアンドドロップによる並べ替え、および複数のタブコントロール間での移動をサポートしています。
タブページにアイコンを表示する簡単な方法を選択します。タブコントロールには _TabControl.ImageList
_ プロパティがあり、タブページには _TabPage.ImageIndex
_ プロパティがあります。そのため、画像リストに3つのアイコン(通常、ホバー、押す)を追加し、マウスイベントを処理しました。
TabControl.GetTabRect()
を使用すると、マウスが特定のタブページ上にあるかどうかをテストできます。また、数学を使用すると、アイコンの上にあるかどうかを確認できます。次に、マウスボタンの状態に応じてアイコンを変更し、ボタンが押された場合は最終的にマウスの下のタブページを削除する必要があります。
このソリューションの主な問題は、マウスがアイコンの上にあるかどうかを計算するには、アイコンがタブページに対してどこに描画されるかを知る必要があり、これは新しいウィンドウズバージョンで変わる可能性があることです。アイコンはタイトルの左側にありますが、見た目は悪くありません。
私はこのコードを見つけて、とても役に立ちました:
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);
}
}
}
}
私は次のことを行いました:作成(追加)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);
}
多分それはあなたが望むものではないかもしれませんが、それはうまくいきます。
同様の設定を作成しました。
実行時にタブページに追加される各コントロールは、私が作成した特別な基本コントロールから派生します。この基本コントロールには、閉じるボタンがあります(フラグを安全に閉じるなど、他のいくつかの機能と共に)。
ベースコントロールで使用しているタブコードを閉じる:
TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(parent);
私はこれが古いスレッドであることを知っていますが、これを見つけました link これにより、配列内のタブを「非表示」にして、実行時に必要なタブを再ロードすることができます。簡単に見つけられる場所にこれを追加しました。
このコードは、マウスの中央クリックでタブコントロールを閉じるのに役立ちます。
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;
}
}
}