TabControlでタブを無効にする方法はありますか?
回答:
TabPageのクラスには、Enabledプロパティを隠します。厄介なUIデザインの問題があるため、これは意図的なものでした。基本的な問題は、ページを無効にしてもタブが無効にならないことです。また、Selectingイベントでタブを無効にすることでこれを回避しようとすると、TabControlにページが1つしかない場合は機能しません。
これらのユーザビリティの問題が問題にならない場合は、プロパティが引き続き機能することを覚えておいてください。これは、IntelliSenseから隠されているだけです。FUDが不快な場合は、次のようにするだけです。
public static void EnableTab(TabPage page, bool enable) {
foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}
TabPageをコントロールにキャストしてから、Enabledプロパティをfalseに設定します。
((Control)this.tabPage).Enabled = false;
したがって、タブページのヘッダーは引き続き有効になりますが、その内容は無効になります。
あなたは単に使うことができます:
tabPage.Enabled = false;
このプロパティは表示されていませんが、問題なく機能します。
Selectingイベントをプログラムして、TabControler
編集不可能なタブに変更できないようにすることができます。
private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPageIndex < 0) return;
e.Cancel = !e.TabPage.Enabled;
}
Visible
。私がテストしたとき、実際には視覚的な効果はなかったようですが、これはプロパティにも当てはまるようです。
「選択中」イベントを登録して、タブページへのナビゲーションをキャンセルすることができます。
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage == tabPage2)
e.Cancel = true;
}
もう1つのアイデアは、パネルコントロールのタブページにあるすべてのコントロールを配置し、パネルを無効にすることです。スマイリー
tabControl1.TabPagesコレクションからタブページを削除することもできます。それはタブページを隠すでしょう。
クレジットはlittleguru @ Channel9に送られます。
おそらく、タブコントロールにタブを表示したいが、タブを「無効」(つまり、灰色で選択不可)にしたい場合があります。これに対する組み込みのサポートはありませんが、描画メカニズムをオーバーライドして、目的の効果を与えることができます。
これを行う方法の例をここに示します。
魔法は、提示されたソースからのこのスニペットと、DisableTab_DrawItemメソッドにあります。
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
Control
:を無効にした後、CédricGuillemetteの回答を拡張します。
((Control)this.tabPage).Enabled = false;
...次に、TabControl
のSelecting
イベントを次のように処理できます。
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
これによりタブページが削除されますが、必要に応じて再度追加する必要があります。
tabControl1.Controls.Remove(tabPage2);
後で必要になる場合は、削除する前に一時的なタブページに保存し、必要に応じて再度追加することをお勧めします。
唯一の方法は、Selecting
イベントをキャッチしてタブがアクティブにならないようにすることです。
最もトリッキーな方法は、親をnullに等しくすることです(親なしでタブだけを作成します)。
tabPage.Parent = null;
そして、あなたがそれを返したいとき(ページコレクションの終わりにそれを返します):
tabPage.Parent = tabControl;
そして、あなたがそれをあなたが使うことができるページの中の特定の場所に戻したいならば:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
あなたはタブページを通してそれをすることができます:tabPage1.Hide()、tabPage2.Show()など。
イベントとタブコントロールのプロパティを使用して、必要なときに必要なものを有効/無効にすることができます。tabControlが使用されているmdi子フォームクラスのすべてのメソッドで使用できる1つのブール値を使用しました。
いずれかのタブがクリックされるたびに、選択イベントが発生することに注意してください。多数のタブの場合、「CASE」は多数のifよりも使いやすい場合があります。
public partial class Form2 : Form
{
bool formComplete = false;
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
formComplete = true;
tabControl1.SelectTab(1);
}
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (tabControl1.SelectedTab == tabControl1.TabPages[1])
{
tabControl1.Enabled = false;
if (formComplete)
{
MessageBox.Show("You will be taken to next tab");
tabControl1.SelectTab(1);
}
else
{
MessageBox.Show("Try completing form first");
tabControl1.SelectTab(0);
}
tabControl1.Enabled = true;
}
}
}
ユーザーはタブをクリックしてナビゲートすることはできませんが、2つのボタン(NextおよびBack)を使用することはできます。//条件が満たされない場合、ユーザーは次の条件に進むことができません。
private int currentTab = 0;
private void frmOneTimeEntry_Load(object sender, EventArgs e)
{
tabMenu.Selecting += new TabControlCancelEventHandler(tabMenu_Selecting);
}
private void tabMenu_Selecting(object sender, TabControlCancelEventArgs e)
{
tabMenu.SelectTab(currentTab);
}
private void btnNextStep_Click(object sender, EventArgs e)
{
switch(tabMenu.SelectedIndex)
{
case 0:
//if conditions met GoTo
case 2:
//if conditions met GoTo
case n:
//if conditions met GoTo
{
CanLeaveTab:
currentTab++;
tabMenu.SelectTab(tabMenu.SelectedIndex + 1);
if (tabMenu.SelectedIndex == 3)
btnNextStep.Enabled = false;
if (btnBackStep.Enabled == false)
btnBackStep.Enabled = true;
CannotLeaveTab:
;
}
private void btnBackStep_Click(object sender, EventArgs e)
{
currentTab--;
tabMenu.SelectTab(tabMenu.SelectedIndex - 1);
if (tabMenu.SelectedIndex == 0)
btnBackStep.Enabled = false;
if (btnNextStep.Enabled == false)
btnNextStep.Enabled = true;
}
これらのコントロールがあると仮定します。
tcExempleという名前のTabControl。
tpEx1およびtpEx2という名前のTabPage。
それを試してみてください:
TabPageのDrawModeをOwnerDrawFixedに設定します。InitializeComponent()の後で、次のコードを追加してtpEx2が有効になっていないことを確認します。
((Control)tcExemple.TabPages["tpEx2").Enabled = false;
以下のコードをSelectiontcExempleイベントに追加します。
private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e)
{
if (!((Control)e.TabPage).Enabled)
{
e.Cancel = true;
}
}
tcExempleのDrawItemイベントに次のコードを添付します。
private void tcExemple_DrawItem(object sender, DrawItemEventArgs e)
{
TabPage page = tcExemple.TabPages[e.Index];
if (!((Control)page).Enabled)
{
using (SolidBrush brush = new SolidBrush(SystemColors.GrayText))
{
e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds);
}
}
else
{
using (SolidBrush brush = new SolidBrush(page.ForeColor))
{
e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds);
}
}
}
2番目のタブはクリックできなくなります。
これは古い質問ですが、誰かが私の追加から利益を得るかもしれません。非表示のタブを連続して表示するTabControlが必要でした(現在のタブでアクションが実行された後)。そこで、ロード時にHideSuccessive()を継承して呼び出すクイッククラスを作成しました。
public class RevealingTabControl : TabControl
{
private Action _showNextRequested = delegate { };
public void HideSuccessive()
{
var tabPages = this.TabPages.Cast<TabPage>().Skip(1);
var queue = new ConcurrentQueue<TabPage>(tabPages);
tabPages.ToList().ForEach(t => t.Parent = null);
_showNextRequested = () =>
{
if (queue.TryDequeue(out TabPage tabPage))
tabPage.Parent = this;
};
}
public void ShowNext() => _showNextRequested();
}
フォームのロードイベントで、と書くthis.tabpage.PageEnabled = false
と、タブページが無効になります。
解決策は非常に簡単です。
この行を削除/コメントする
this.tabControl.Controls.Add(this.YourTabName);
MainForm.csのIntializeComponent()メソッド内
その質問に対する適切な答えが見つかりませんでした。特定のタブを無効にする解決策はないようです。私がしたことは、特定のタブを変数に渡し、SelectedIndexChanged
イベントでそれをSelectedIndex
:に戻すことです。
//variable for your specific tab
int _TAB = 0;
//here you specify your tab that you want to expose
_TAB = 1;
tabHolder.SelectedIndex = _TAB;
private void tabHolder_SelectedIndexChanged(object sender, EventArgs e)
{
if (_TAB != 0) tabHolder.SelectedIndex = _TAB;
}
したがって、実際にはタブを無効にすることはありませんが、別のタブをクリックすると、常に選択したタブに戻ります。