我有一個TabControl
,其中我想要阻止添加現有的TabPage
(它們由名稱標識),而將SelectedTabPage
設置爲該精確的選項卡。TabControl AddingTab事件
我想知道,如果有觸發一個頁面被添加到TabControl
權之前的事件。如果不是,將使用TabPages
(列表)的事件CollectionChanged
作爲正確的選擇嗎?
我有一個TabControl
,其中我想要阻止添加現有的TabPage
(它們由名稱標識),而將SelectedTabPage
設置爲該精確的選項卡。TabControl AddingTab事件
我想知道,如果有觸發一個頁面被添加到TabControl
權之前的事件。如果不是,將使用TabPages
(列表)的事件CollectionChanged
作爲正確的選擇嗎?
我相信你正在尋找的事件是Control.ControlAdded
事件:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controladded.aspx
如果還檢測什麼時候自己添加的標籤頁裏面的東西,你應該能夠過濾掉一切,但TabPage
控件在事件處理程序中使用ControlEventArgs.Control
屬性。
拒絕添加控件會稍微複雜一些。由於此事件似乎只有提高後控制被添加,你需要做這樣的事情:
void onControlAdded(object sender, ControlEventArgs e) {
var tab = e as TabPage;
if (tab == null)
return;
this.myTabControlObject.TabPages.Remove(tab);
}
這應該刪除的選項卡,但它可能會延緩標籤添加過程相當。
有沒有辦法阻止添加控件?我只能看到一種方式來訪問此事件添加的控件。 –
嘗試類似這樣的操作,我正在檢查TabControl
頁面集合與正在嘗試添加的頁面具有相同名稱的頁面(如果存在)我將焦點設置爲現有實例,否則添加新頁面到TabControl
。看看這樣的事情是否適合你。控制已被添加後具有與該ControlCollection
做
private void button1_Click(object sender, EventArgs e)
{
TabPage tp = new TabPage();
tp.Name = tabPage1.Name;
var temp =tabControl1.Controls.Find(tp.Name,true);
if(temp.Length > 0)
{
tabControl1.SelectedTab = (TabPage) temp[0];
}
else
tabControl1.Controls.Add(tp);
}
任何將最有可能被觸發。
從以上鍊接:
可以確定是否控制是通過使控制進入包含方法的集合的成員。要獲取集合中控件位置的索引值,請將該控件傳遞給IndexOf方法。可以通過調用CopyTo方法將集合複製到數組中。
如果你願意,你可以清理你的代碼中加入一個ExtensionMethod
您TabControl
檢查現有的頁面中,將焦點或從那裏添加。
例子:
namespace ExtensionMethods
{
public static class MyExtensions
{
public static bool AddPage(this TabControl tc, TabPage tp)
{
var matchedPages = tc.Controls.Find(tp.Name, false);
if (matchedPages.Length > 0)
{
tc.SelectedTab = (TabPage)matchedPages[0];
return true;
}
else
{
tc.TabPages.Add(tp);
tc.SelectedTab = tp;
return false;
}
}
}
}
用法:
tabControl1.AddPage(tp);
我以前有過類似的解決方案,但我想知道是否可以直接在集合或選項卡控件中處理它。 –
@ Francis.Beauchamp看到我的編輯,因爲即使它們是物理上不同的實例,但是您處理的名稱是相同的,Find方法將起作用。據我所見,只有在添加頁面後,其他方法纔會響應。 –
一個TabControl應該永遠是你的Form類的私有變量。用戶自己不能添加任何頁面。所以通常只有你自己的代碼可以添加一個頁面。這引出了一個問題,你爲什麼要設法保護自己免受自己的代碼侵害。它不像外部代碼沒有任何其他方式來添加頁面,如果它真的想要的話。 UI自動化可以訪問選項卡控件。反射總是一個後門。停止採取強硬措施。 –
我同意Hans Passant,你的要求很奇怪而且不實際。 –
@Hans Passant在visual studio中,無法在項目中打開文檔的兩個實例。相反,它會調用現有的實例並將SelectedTab設置爲同一個實例。這是我正在尋找的確切行爲。 –