2011-04-18 39 views
0

我正在使用Windows應用程序窗體。我有一個CustomControl(說MasterControl)上,我把一個分裂面板,現在我的MasterControl被分成三個部分說:C#:如何從另一個自定義控件訪問自定義控件的公共成員

  • Pannel1
  • Pannel2
  • Pannel3

現在我發展三個自定義控件,並在每個pannels中放置一個例如

  • Pannel1有CustomControl1
  • Pannel2有CustomControl2
  • Pannel3有CustomControl3

現在某處CustomControl3我需要訪問公共成員CustomControl1的。爲此,我寫了以下代碼:

((MasterControl)this.Parent)._oCustomControl1.PublicMember = this.PublicMember; 

上面的代碼在我的情況下不起作用。當這行代碼在調試模式下執行時,會出現一個消息框,並指出「沒有可用於當前位置的代碼」

+0

看起來你正在運行一個過時的項目。 – 2011-04-18 11:58:08

回答

0

我自己找到了答案。我在這裏定位,因爲它可能會幫助其他人。 確切的代碼是:

((MasterControl)this.Parent.Parent.Parent)._oCustomControl1.PublicMember = this.PublicMember; 

基本上我coustomcontrol3在於一個分割容器面板的內部,因此,當我寫道: this.Parent然後它指向其所駐留面板中,如果我寫 this.Parent.Parent然後它指向在spliter容器,其面板上方存在,如果我寫 ​​然後將其指向控制在這個分裂容器駐留

我從「法齊ZAKER」答案的想法,所以拜他爲他的貢獻

2

如果您的主控制器中有一個拆分面板,則應該使用兩個級別找到你的主控:

((MasterControl)this.Parent.Parent)._oCustomControl1.PublicMember = this.PublicMember; 
3

這是一個非常糟糕設計爲您的控件取決於如何被排列在父容器上。

例如在第三個控件中,通過從父項訪問它來查詢第一個控件的屬性,然後通過名稱控制它。

如果可以編譯的話,你的代碼會很容易中斷 - 我認爲你遇到的問題是編譯順序:爲了編譯你的父窗體,它需要有子用戶控件完了。另一方面,您創建的用戶控件需要完成表單。

從這些控件的容器中設置你想要的任何行爲將會好得多 - 例如,通過對控件的事件作出反應,並在適當的其他控件上設置適當的東西(還有其他方法當然 - 關鍵在於信息的方向和流向 - 誰在設置和使用什麼)。

+0

我完全同意你的看法,但是它的舊代碼和我只做了一些升級。 – Jame 2011-04-19 04:59:29

相關問題