2012-04-18 4 views
3

VS私は、基本クラス一般的なフォームとは、デザイナー

internal partial class View<T> : UserControl 
    where T : class 
{ 
    protected T t; 
} 

を持っていると私は見る

internal partial class ViewChild<T> : View<T> 
    where T : class 
{ 
} 

それはOK作品から子供を導出したいが、私はVSのデザイナでViewChildを編集することはできません。私は問題が一般的な基本クラスであることを知っています。しかし、私はこの場合どのように回避できるのか分かりません。 これを修正する方法はありますか?

答えて

2

ジェネリックは、タイプなしでクラスをインスタンス化できないため、デザイナーを壊しますT。私は私のブログの記事では、回避策について説明します。要するに

http://adamhouldsworth.blogspot.co.uk/2010/02/winforms-visual-inheritance-limitations.html

を、あなたは中間のクラスとタイプを "解決" する必要があります。

  • BaseControl<T> : UserControl
  • CustomerControl_Design : BaseControl<Customer>
  • CustomerControl : CustomerControl_Design

あなたca nはその後、条件付きDEBUGまたはRELEASEコンパイラのスイッチに基づいてコードのうち、このクラスを切り替える:

#if DEBUG 

namespace MyNamespace 
{ 
    using System; 


    public partial class CustomerEditorControl_Design : BaseEditorControl<Customer> 
    { 
     public CustomerEditorControl_Design() 
      : base() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

#endif 

    public partial class CustomerEditorControl 
#if DEBUG 
     : CustomerEditorControl_Design 
#else 
     : BaseEditorControl<Customer> 
#endif 
    { 
    } 

これは残念ながら、あなたが設計することが可能になることはありません、あなたはCustomerControlの派生クラスを開くようになります署名のジェネリックによるUIコントロール私の解決策は、派生アイテムの設計のみを可能にすることです。

CustomerControl : BaseControl<Customer>がこの場合のように機能しない理由はわかりませんが、タイプTが定義されていますが、一般的な使用法のために推測していません。

Microsoftの防衛のために、これはサポートされていないと言います。

+0

これはコンクリートの顧客タイプに対してのみ機能し、異なるタイプのViewChildを使用したい場合は動作しません。View にいくつかの基本コードがありますが、ViewChildを拡張するとにいくつかのコードが追加され、View 、ViewChild 、ViewChild などが表示されます – wince

+0

@wince正しいです。答えに記載されているように、それは派生したフォームの問題を解決するだけです。実際にコンテンツを持っている一般的なベースフォームを持っているなら、そのアイデアをビニングして、シェルのような構成をすることをお勧めします。私の使い方では、基本コントロールはビジュアルではなくロジックのみを提供していました。 –

+0

@winceあなたの 'View 'と 'ViewChild 'にも視覚的な要素がありますか、それとも単なるコードですか? –

3

は別の方法があり、それはコンパイラフラグに依存しない:

http://wonkitect.wordpress.com/2008/06/20/using-visual-studio-whidbey-to-design-abstract-forms/

私は本当に、条件付きコンパイルの使用をお勧めしません。フレームワークで作業するほうがずっといいですし、フレームワークではありません。

基本的に、VSに既存のフレームワークを通して異なるクラスを与えることができます。あなたは、デザイナーとして別のクラスを使用するようにVSに指示するTypeDescriptionProvider属性を使って基本クラスを飾ります。

元のブログの投稿に記載されているように、この回避策に関連する警告があるかもしれませんが、共通の基本クラスを継承した> 25 UserControlsのプロジェクトでうまく機能しています。

+0

これは素晴らしい解決策ですが、ジェネリックは言及していません。ジェネリック薬を使用したのですか? –

+0

問題のドメインは実際に同じです。つまり、デザインされたタイプのVSホスティングインスタンスです。 VSがジェネリックについて話題になっているのは、抽象クラスのようにそれらをインスタンス化できないということです。この点で、すべてのジェネリックは疑似抽象です。彼らは型パラメータなしでランタイムに意味をなさない。あなたの質問に答えるために、私は簡単に(Winformsで)強く型付けされたビューの未完成の実装のためのジェネリックベースクラスを使用しましたが、今のところ、私は実際の機能を実装することに特有のアーキテクチャ転換を引退しました。私はおそらく月の終わりにそれに戻ります。 –

+0

+1この週末に時間があれば、古いコードを更新してみましょう。基本クラスを設計できるかどうかを確認してください。 –

関連する問題