2009-12-17 41 views
7

我有一個自定義類,它來自UserControl。 該代碼:C#鍵入<T> usercontrol在設計模式下給出錯誤

public partial class Gallery<T> : UserControl where T : class, IElement, new() 

這個課堂喜歡它應該工作。但是,當我嘗試輸入包含這些Gallery類的形式的設計模式,它給我的錯誤:

  • 找不到類型「PresentrBuilder.Forms.Gallery」。 請確保引用了包含此類型的程序集 。 如果此類型是您的 開發項目的一部分,請確保 該項目已成功建成 。

  • 變量'pictureGallery'要麼是未聲明的,要麼從未被分配過 。

注:(pictureGallery實際上是Gallery<PictureElement>)。

如何解決這個問題?這樣,我無法在設計模式下工作,這使得創建我的用戶界面非常困難。

回答

12

設計師討厭(即不支持)通用控件,而且不會很快改變,所以不要這樣做。相反,考慮擁有一個接受Type的屬性(或類似),並在運行時(反射等)做一些工作 - 或者:不要使用設計器。

例如,如果您有:

public Type ControlType {get;set;} // comparable to T in the original 

您可以使用:

IElement el = (IElement) Activator.CreateInstance(ControlType); 

這會給你你目前所擁有的一切(newIElement等) - 但它只是可以」在編譯時做任何驗證。

+0

這個問題被問到五年了。在Visual Studio的新版本中是否有所改變? – Misiu 2015-12-04 12:29:38

+0

@Misiu不AFAIK – 2015-12-04 17:16:45

+0

絕對不是因爲我現在有完全相同的問題。 – nicV 2016-03-03 13:06:20

11

有時在這種情況下最容易做的事是創建一個空子類來限定泛型參數。

這通常與的ObservableCollection完成:

public class SomeItemCollection : ObservableCollection<SomeItem>{ 

} 

它是一種有刺激性,但它可能會解決你的問題。

1

而不是有一個通用的控制,讓控制與一個泛型的類與控制本身分開交互。然後將這個類傳入控件。

3

與其他人一樣,Visual Studio Designer在處理控件中的泛型時遇到了很多麻煩。當我嘗試實現像通用的「屬性查看器」類時,我自己遇到了這個問題。

對我而言,解決方案就是定義一箇中間類,就像Egor說的那樣。如果我沒有理解你的問題,你的情況,應該是這樣的:

public class PictureElementGallery : Gallery<PictureElement> 

然後在窗體上使用PictureElementGallery,而不是畫廊< PictureElement>的。 設計師應該沒有問題。