2011-04-01 72 views
0

我有一個窗體左側面板,其中純粹由單選按鈕組成,tabcontrol在中間,其中有多個標籤頁。這些單獨的標籤頁中都有一系列datagridviews,根據您檢查哪個單選按鈕來顯示和隱藏它們。隱藏datagridviews錯誤

我通過使每個上分配一個CheckChanged事件,該事件通過所有的內tabpagecontrol.SelectedTab控件的循環左側的單選按鈕的實現這一點的效果,並在對應的datagridview的調用.Show(),並調用.Hide ()其餘的,這樣一次只能看到一個datagridview。

當我嘗試以編程方式檢查其中一個RadioButton時,會出現我的問題。比方說在方法X中,我寫了RadioButtonA.checked = true。這會觸發通常的CheckedChange事件處理,該處理會遍歷當前選定的頁面上的所有datagridviews,並調用.Hide()除了單選按鈕應顯示並調用.Show()的一個datagridview窗體。但是,在datagridview上的這些.Hide()調用中的一個上,它最終第二次觸發RadioButtonA.CheckedChange事件AGAIN。當我看看傳遞給函數的sender參數時,它顯示發件人是我以編程方式點擊的RadioButton。

我以編程方式添加這些datagridviews,並可以確認沒有任何事件處理程序分配給他們。任何人都可以幫助我確定是什麼導致這個額外的事件被觸發?謝謝。

回答

0

對於通過涓流,破壞我的其他形式的事件處理討厭的變化事件,我已經找到了唯一的解決辦法是增加一個小的布爾值:

bool radioIng; 

void MyMethod() { 
    radioIng = true; 
    try { 
    radioButton1.Checked = true; 
    // etc. 
    } finally { 
    radioIng = false; 
    } 
} 

void radioButton_EventHandler(object sender, EventArgs e) { 
    if (radioIng) return; 
    // rest of code here 
} 

編輯:

或者,您可以刪除所有事件處理程序並稍後重新連接它們:

void MyMethod() { 
    try { 
    radioButton1.CheckChanged -= radioButton_EventHandler; 
    radioButton2.CheckChanged -= radioButton_EventHandler; 
    radioButton3.CheckChanged -= radioButton_EventHandler; 
    // execute your code 
    radioButton1.Checked = true; 
    } finally { 
    radioButton1.CheckedChanged += new EventHandler(radioButton_EventHandler); 
    radioButton2.CheckedChanged += new EventHandler(radioButton_EventHandler); 
    radioButton3.CheckedChanged += new EventHandler(radioButton_EventHandler); 
    } 
} 

void radioButton_EventHandler(object sender, EventArgs e) { 
    if (sender == radioButton1) { 
    // code here to handle 
    } else if (sender == radioButton2) { 
    // code here to handle 
    } else if (sender == radioButton3) { 
    // code here to handle 
    } 
} 
+0

感謝jp2code的建議,但似乎這對待症狀而不是原因。如果可能的話,我想解決潛在的問題,並採取這種方法作爲最後的手段。謝謝。 – NeedHelp 2011-04-01 20:42:24

+0

使用解決基本問題的更正確技術進行編輯。 :)布爾解決方案同樣有效......並且速度更快! – jp2code 2011-04-01 21:17:17