2013-04-05 62 views
2

我有一個自定義控件,我用它創建了一堆標準的windows asp控件。將屬性轉化爲自定義控件C#

問:

是否有可能繼承父控件的屬性到自定義的控制,而無需重新發明輪子?

因此,例如我有一個按鈕,文本框和標籤的控件。

通常我可以通過Lable1.Text訪問該控件的屬性,但是當這些控件位於自定義控件中時,如何在不封裝該控件的所有屬性的情況下訪問它們。

我希望這樣的事情CustomControl1.Lable1.Text或這是不可能的

如果我用這個 公共標籤lbMovieName { 得到{this.lbMoveName; } set {lbMovieName = value; } }

我得到了我需要的東西,但是請你告訴我爲什麼我不應該這樣做?

+1

你有沒有試過這個.Label1.Text? – Felix 2013-04-05 14:47:41

+0

您可以使用公共只讀屬性公開內部控件。儘管只是公開內部控件的屬性對您的自定義控件有意義,這可能是更好的做法。 – juharr 2013-04-05 14:56:30

+1

@tijizor我相信OP正在討論從自定義控件的外部獲取Lable1.Text。 – juharr 2013-04-05 14:58:08

回答

2

最簡單的方法是通過公共只讀屬性暴露控制:

public Label MyLabel 
{ 
    get { return this.Label1; } 
} 

但是封裝只是要公開的數值肯定是有以下幾個原因清潔的解決方案:

  1. 在這種情況下,您可以抽象出實際控制類型與綁定到Label - 如果您公開該控件,將很難將標籤替換爲MyNewCoolLabel,例如
  2. 你可能會暴露更多的要 - 客戶端可以更改標籤的顯示性能等
+0

D Stanley我不確定你指出的是關於客戶端能夠更改顯示屬性,當然,如果他們想要顯示不同的東西,他們應該能夠......不應該他們 – MrBronz 2013-04-05 15:23:01

+0

@我的觀點是客戶端(控件的頁面)可以改變控件的任何屬性,而不僅僅是文本 - ID,字體,顏色,大小,位置,CSS類,甚至可能添加事件處理程序(我從來沒有試過它知道)。對於標籤來說,它可能不是什麼大不了的事,但對於按鈕和輸入控件來說,它可能會暴露出你不認爲的風險。如果你想暴露控件的所有屬性,但是封裝主要屬性(文本通常是最大的屬性)是更安全和更普遍的做法。 – 2013-04-05 15:27:37

+0

請原諒我的無知,但首先要指出一個人會怎麼做?第二點,添加一個事件處理程序需要在後面的代碼中進行操作。並且對其工作系統有深入的瞭解嗎? – MrBronz 2013-04-05 15:31:29

0

的最佳方式和最佳實踐,我認爲,是創建自定義的控件的屬性是隻公開你需要的東西。您控制範圍內的其他內容應保持私密。像這樣的東西:

public string LabelText { 
    get { return this.Label1.Text; } 
    set { this.Label1.Text = value; } 
} 

...等等,你需要暴露的其他屬性。這也會讓你在設計師中有很好的智能反應。

+0

Floremin這就是我想避免的我不能看到重新發明輪子! – MrBronz 2013-04-05 15:19:14

+0

這不是重新發明輪子。這是OO編程:你暴露需要暴露的東西,並隱藏不需要暴露的東西。除此之外,您可以將自定義控件的'Label1'屬性公開,並且您將可以訪問其所有屬性。 – Floremin 2013-04-05 15:22:05

+0

好吧,我明白這一點,但...如果我只使用讓我們說一個文本框,也暴露其所有的屬性完全相同的方式。我的意思是不在自定義控件中的文本框 – MrBronz 2013-04-05 15:37:10

1

如果您試圖避免創建屬性,則可以將控件設置爲公開(這不是完美的OO開發)。正如其他人已經提到的那樣,您可以更好地展示您希望通過媒體資源共享的信息。