c#
  • event-handling
  • action
  • buttonclick
  • 2011-11-05 34 views 0 likes 
    0

    我想知道如何設置一個EventHandler來點擊按鈕,這樣它就可以替換這個對象的所有其他處理程序。理想情況下是這樣的人的東西:C#ButtonClick動作來取代所有其他人?

    button1.Click = MessageBox.Show("Run just this!"); //Yes, the '=' instead of the '+='. 
    

    這是因爲Button1的已經有幾個點擊事件,我想,在determinated情況下,覆蓋所有其他的人。

    更多的例子:

    button1.Click += MessageBox.Show("Event #1 has been triggered!"); 
    button1.Click += MessageBox.Show("Event #2 and #1 have been triggered!"); 
    button1.Click = MessageBox.Show("Event #3, and only #3, has been triggered!"); 
    

    回答

    1

    你可以試試這個...

    上有MSDN forums的解決方案。下面的示例代碼將從button1中刪除所有Click事件。

    你可以保持在一個按鈕事件.....

    public partial class Form1 : Form 
    { 
         public Form1() 
         { 
          InitializeComponent(); 
    
          button1.Click += button1_Click; 
          button1.Click += button1_Click2; 
          button2.Click += button2_Click; 
         } 
    
         private void button1_Click(object sender, EventArgs e) 
         { 
          MessageBox.Show("Hello"); 
         } 
    
         private void button1_Click2(object sender, EventArgs e) 
         { 
          MessageBox.Show("World"); 
         } 
    
         private void button2_Click(object sender, EventArgs e) 
         { 
          RemoveClickEvent(button1); 
         } 
    
         private void RemoveClickEvent(Button b) 
         { 
          FieldInfo f1 = typeof(Control).GetField("EventClick", 
           BindingFlags.Static | BindingFlags.NonPublic); 
          object obj = f1.GetValue(b); 
          PropertyInfo pi = b.GetType().GetProperty("Events", 
           BindingFlags.NonPublic | BindingFlags.Instance); 
          EventHandlerList list = (EventHandlerList)pi.GetValue(b, null); 
          list.RemoveHandler(obj, list[obj]); 
         } 
        } 
    } 
    
    +0

    應該不是第一次的GetValue(在靜態密鑰)是通過空? –

    +0

    這會工作,但違反了很多設計原則。我建議OP不要使用這種方法,而是要重新考慮他們如何訂閱。特別是:***你不知道的***可能會退訂。 –

    +0

    由於......這是如此完美,一滴眼淚流下我的眼睛!太棒了!!!! – henriquesirot

    0

    按照設計,不能正常退訂其他調用。這是因爲他們不是你關心的。你可以使用反射來解決它,但它幾乎可以肯定是一個EventHandlerList非常重要。如果您是我們對控件進行分類,您可以重寫OnClick來執行此操作,但它似乎仍然是......反社會的。

    如果你是訂閱所有這些的人,你可以簡單地......不訂閱你不想運行的東西。

    相關問題