使用TabControl.SelectTab("...")
顯示標籤,但它也給出標籤焦點。我想顯示一個特定的選項卡,但請保持關注位置。選擇TabControl中的標籤頁而不偷竊焦點
我在網格中有數據行。根據所選行的屬性,我顯示不同的標籤頁以擁有不同的UI佈局。但是當使用箭頭鍵滾動行時,焦點會切換到選定的選項卡 - 我不希望發生這種情況。
謝謝。
使用TabControl.SelectTab("...")
顯示標籤,但它也給出標籤焦點。我想顯示一個特定的選項卡,但請保持關注位置。選擇TabControl中的標籤頁而不偷竊焦點
我在網格中有數據行。根據所選行的屬性,我顯示不同的標籤頁以擁有不同的UI佈局。但是當使用箭頭鍵滾動行時,焦點會切換到選定的選項卡 - 我不希望發生這種情況。
謝謝。
我不認爲有一個內置的功能,但你可以這樣做:
private bool skipSelectionChanged = false;
private void dataGridView_SelectionChanged(object sender, EventArgs e)
{
if (skipSelectionChanged)
return;
// supposing we decide tab[0] has to be selected...
this.SelectTabWithoutFocus(this.tabControl1.TabPages[0]);
}
private void SelectTabWithoutFocus(TabPage tabPage)
{
this.skipSelectionChanged = true;
// "this" is the form in my case, so you get the current focused control
// (ActiveControl), backup it, and re-set it after Tab activation
var prevFocusedControl = this.ActiveControl;
if (this.ActiveControl != null)
{
this.tabControl1.SelectedTab = tabPage;
prevFocusedControl.Focus();
}
this.skipSelectionChanged = false;
}
在這裏,我備份當前的重點控制,選擇所需的選項卡,最後設置焦點到原來的控制。
跳過布爾值是必要的,因爲將重點放在網格上會再次觸發SelectionChanged
事件,從而導致無限循環。
您可以嘗試在設置選定選項卡之前禁用TabControl
,然後重新啓用它。這將阻止它集中注意力。我在一個帶有一些控件的選項卡控件上測試了它,並沒有看到任何視覺變化,但是您必須在UI中嘗試它,看看它是否適合您。
tabControl1.Enabled = false;
tabControl1.SelectTab("tabPage4");
tabControl1.Enabled = true;
爲了安全起見,您可以放置該行以重新啓用finally塊中的TabControl以確保它不會被禁用。
這將選擇的標籤頁,而將重點放在頂部,如要求在這裏以上:
tc.TabPages[0].Enabled = false;
tc.SelectTab(0);
tc.TabPages[0].Enabled = true;
TC在這裏我對的TabControl類型實例(即它是我的標籤控件,它有幾個「標籤頁」)。這適用於我。我的目的是用左右鍵(arrows)
來循環瀏覽這些標籤頁。即當我往前走(由Key.Right
)和到達最後tabpage
我想有我專注於[0]
沒有激活的DataGridView,我有在該網頁上,當我往回走(由Key.Left
),達到[0]
我想有[tc.TabCount - 1]已啓用,這是最後一個。對於這種情況下的代碼是:
tc.TabPages[tc.TabCount - 1].Enabled = false;
tc.SelectTab(tc.TabCount - 1);
tc.TabPages[tc.TabCount - 1].Enabled = true;
代碼的完整的段子:
private bool KeyTc(System.Windows.Forms.Keys keyData)
{
if (keyData == K.Left && tc.SelectedIndex == 0)
{
tc.TabPages[tc.TabCount - 1].Enabled = false;
tc.SelectTab(tc.TabCount - 1);
tc.TabPages[tc.TabCount - 1].Enabled = true;
return true;
}
else if (keyData == K.Right && tc.SelectedIndex == tc.TabCount - 1)
{
tc.TabPages[0].Enabled = false;
tc.SelectTab(0);
tc.TabPages[0].Enabled = true;
return true;
}
return false;
}
這BOOL KeyTc
在返回的情況下,在一個switch語句關鍵評價:
protected override bool ProcessCmdKey(ref Message keyMsg, Keys keyData)
{ switch keyData { ... } }
這實際上不是與@adrift相同的答案嗎? – MicroVirus 2014-08-30 13:49:45
基於「Jeff Ogata提出的解決方案:您可以在設置選定的選項卡之前嘗試禁用TabControl,然後重新啓用它,這將阻止它獲得焦點」,這裏是bel低我的解決方案:
tabMain.SelectedPageChanging += (s, e) =>
{
tabMain.Enabled = false;
};
tabMain.SelectedPageChanged += (s, e) =>
{
tabMain.Enabled = true;
};
注意:此代碼是使用DevExpress「DevExpress.XtraTab.XtraTabControl」。
雖然我不認爲這是一個理想的解決方案,但這個想法最終在我的應用程序中效果最佳。謝謝。 – TheSean 2011-03-10 13:25:09
很高興能有所幫助:) – digEmAll 2011-03-10 14:07:22
我不確定此解決方案是否可以在所有情況下都能正常工作,請參閱[此問題](http://stackoverflow.com/q/435433/806690)。 – tm1 2014-05-15 07:10:20