2010-09-03 48 views
1

比方說,我有一個表格和他的孩子 ,我想孩子觸發他的父親沒有他們知道在我希望孩子是通用換句話說對方 C# - 如何小孩和父母comuncate

例如,假設我有一個表單按鈕和一個richTextBox,並且我想用evey單擊來更改richTextBox文本

我想要窗體和按鈕不知道對方我該怎麼做? 我嘗試這一個:

public partial class Form1 : Form 
{ 

    delegate void myfatherDelgate(); 
    static int msgCounter = 0 ; 

    public Form1() 
    { 
     InitializeComponent(); 
     button1 = new myButton(); 
     myfatherDelgate += myMethod(); 

    } 
    public void myMethod() 
    { 
     switch (msgCounter) 
     { 
      case 1: 
       { 
        richTextBox1.Text = "first click"; 
        msgCounter++; 
       } 
      case 2: 
       { 
        richTextBox1.Text = "second click"; 
       } 
      defult: this.Close; 
     } 



    } 


} 

公共MyButton類:按鈕 { 靜態INT敏;

protected override void OnClick(EventArgs e) 
    { 
     base.OnClick(e); 
     this.Parent.Invoke(myfatherDelgate()); 
    } 


} 

最簡單的方法就是做:

private void button1_Click(object sender, EventArgs e) 
    { 
     switch (msgCounter) 
     { 
      case 1: 
       { 
        richTextBox1.Text = "first click"; 
        msgCounter++; 
       } 
      case 2: 
       { 
        richTextBox1.Text = "second click"; 
       } 
      defult: this.Close; 
     } 
    } 
在父親形式

...

我覺得我所有的概念都是扯淡能有人在我的光? 但我在這裏的錯誤,它的圓有人可以幫助我在這裏?...

+6

可憐的孩子永遠不會知道他的父親?什麼樣的怪物你.. – 2010-09-03 19:34:35

+0

我知道如何做到這一點,父親知道他的兒子,並覆蓋他 我要求的通用解決方案我知道我的概念是一種可以有人可以有人建議我在設計模式來解決它 – 2010-09-03 19:36:55

+1

每隔一段時間打一次電話都不會受到傷害。你知道,保持聯繫... – jlafay 2010-09-03 19:41:51

回答

2

因此,也許你正在尋找更多的是一個接口實現的:

public interface IMyInterface { 
    void MyAction(); 
} 

public partial class form1 : Form, IMyInterface { 
    public void MyAction() { 
     richTextBox1.Text = "first click"; 
     ... 
    } 
} 

public class button1 : Button { 
    protected override void OnClick(EventArgs e) { 
     var parent = this.Parent as IMyInterface; 
     if(parent != null) { 
      parent.MyAction(); 
     } 
    } 
} 
+0

不可思議!最好的解決方案.... – 2010-09-03 20:00:03

0

在你的榜樣,按鈕知道父Form有一個名爲myFartherDelegate委託。爲什麼不只是處理父窗體上的Button.Click事件?

您的代碼將是這個樣子

public partial class Form1 : Form 
    { 
    static int msgCounter = 1; 
    public Form1() 
    { 
     InitializeComponent(); 
     button1.Click += new EventHandler(button1_Click); 
    } 

    void button1_Click(object sender, EventArgs e) 
    { 
     switch (msgCounter) 
     { 
     case 1: 
      { 
      richTextBox1.Text = "first click"; 
      msgCounter++; 
      } 
      break; 
     case 2: 
      { 
      richTextBox1.Text = "second click"; 
      } 
      break; 
     default: this.Close(); break; 
     } 
    }  
    } 

按鈕一點都不知道父窗體,只是一個正常的按鈕。當然,父母註冊了它對按鈕事件的興趣。如果你需要一個比這更鬆散的耦合,那麼它可能有助於更詳細地解釋這個需求。

+0

它看起來像一個很好的解決方案,但讓我說我有100個按鈕是實現它的最佳方式? – 2010-09-03 20:26:29

+0

@ yoav.str,點擊後所有的按鈕都會做同樣的事情嗎?因爲這是我相信在@Zachary Yates提出的解決方案中會發生的事情。實現IMyInterface的父窗體上的所有按鈕都將調用MyAction,因此窗體上的100個按鈕都會執行相同的操作,或者我錯過了某些內容?大概你希望每個按鈕都有一個獨特的動作,這樣你就可以將一個適當的事件處理程序連接到每個按鈕,當然你可以將同一個處理程序連接到每個按鈕,然後檢查'發送者'參數來決定一個特定的動作。 – 2010-09-03 20:54:35

2

首先你談論窗體上的子元素,而不是表單的實際子類。對?

所以你想刪除窗體和按鈕之間的依賴關係。這可以通過設計模式解決。你可以讓按鈕實現一個IButton的接口。然後在表單中使用Factory類創建按鈕並返回IButton引用而不是MyButton。或者,使用依賴注入而不是工廠。

無論哪種方式,我沒有看到你在做什麼的優勢,你能更詳細地解釋問題嗎?

+0

你能舉個簡單的例子嗎? 這是什麼設計模式名稱?我可以使用反射來決定運行時的類名(這是主要的...)? – 2010-09-03 19:44:31

+0

現在就在這裏工作,永不言棄Yates的答案似乎有你在找什麼。 – JonWillis 2010-09-03 19:58:45

0

如果你想要一個孩子做一些事情,他的父親,父親必須至少知道一個孩子的存在。他不必知道具體情況,但是如果他應該對孩子做出反應,那麼他需要一個孩子會調用的事件處理程序,回調等。

這可以用稱爲依賴倒置原則的基本原理完成。依賴於外部類的類不應該依賴於具體的實現,而應該取決於實現的抽象。家長不應該需要一個特定的孩子,只是看起來像一個,行爲像一個。同樣,兒童不應該知道他們的特定父母,但是如果需要互動,即使孩子不知道父母的聆聽,孩子也必須有一些方法來告訴父母的事情。

嘗試包含IChild引用(按鈕)和公共事件處理程序的父(您的表單)。然後,創建一個實現IChild並具有可引發事件的子項。然後,你需要第三個類來創建(或被賦予)Parent和Child,爲Parent提供Child(作爲IChild),並將Child的事件綁定到Parent的事件處理函數。現在你有一個家長只知道它有一個類似於孩子的東西,而你有一個孩子在有重要事件發生時可以揮動旗幟,但不必知道誰在聽。

+0

o想要了解更多關於這種模式的信息,我可以查看一個例子嗎? – 2010-09-03 20:29:04

+0

這可能是工廠模式的最佳代表。第三個類叫做ParentFactory,會被要求提供一個「水合」Parent,而Factory會知道Parent需要一個Child來實現。它會實例化兩者,將它們連接起來並交給他們。有關使用接口來抽象依賴關係的基本知識,請查看鬆耦合,Liskov替換原則和依賴倒置原則。 – KeithS 2010-09-03 20:57:04