2011-01-18 17 views
0

別のコンボボックス(Janus UICombobox)を継承するカスタムコンボボックスコントロールを開発しています。 データソースをEntityType(LLBLGEN)に基づいて、ユーザーがEntityTypeを選択したときにそのEntityTypeのすべてのデータベースレコードがコンボボックスにロードされるようにしたいと思います。カスタムコンボボックスコントロールカスタムデータソース(カスタムdisplaymemberとvaluememberを使用)

これはうまくいきますが、選択したEntityTypeに基づいてDisplayMemberとValueMemberを選択するようにユーザーにアピールできるようにしたいと思います。

I次のコードを持っている:

public partial class DtUiComboBox : UIComboBox 
{ 
    private Thread _loadThread; 

    public DtUiComboBox() 
    { 
     InitializeComponent(); 
    } 

    //Don't want this to be visible in the designer 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    public new object DataSource 
    { 
     get; 
     set; 
    } 
    //Don't want this to be visible in the designer 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    public new string DisplayMember 
    { 
     get; 
     set; 
    } 
    //Don't want this to be visible in the designer 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    public new string ValueMember 
    { 
     get; 
     set; 
    } 
    //Don't want this to be visible in the designer 
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] 
    public new string DataMember 
    { 
     get; 
     set; 
    } 

    //My Custom DisplayMember that should be based on the EntityFields from the selected EntityType 
    [Category("Data")] 
    public string DisplayField 
    { 
     get; 
     set; 
    } 
    //My Custom ValueMember that should be based on the EntityFields from the selected EntityType 
    [Category("Data")] 
    public string ValueField 
    { 
     get; 
     set; 
    } 

    private EntityType? _entityType; 
    [Category("Data")] 
    public EntityType? EntityTypeSource 
    { 
     get 
     { 
      return _entityType; 
     } 
     set 
     { 
      if (value != null) 
      { 
       _entityType = value; 
       IEntity2 entity2 = Dal.FactoryClasses.GeneralEntityFactory.Create(_entityType.Value); 
       if (!DesignMode && !IsDesignerHost) 
       { 
        if (_loadThread != null && _loadThread.IsAlive) 
        { 
         _loadThread.Abort(); 
         _loadThread.Join(500); 
        } 
        _loadThread = new Thread(new ThreadStart(LoadFromEntityType)); 
        _loadThread.Start(); 
       } 
       Invalidate(true); 
      } 
     } 
    } 

    private void LoadFromEntityType() 
    { 
     if (_entityType.HasValue) 
     { 
      IEntityCollection2 entityCollection = DtBlClient.Instance.Bl.GetCollection(_entityType.Value); 
      LoadFromEntityType(entityCollection); 
     } 
    } 

    private delegate void LoadFromEntityTypeDel(IEntityCollection2 collection2); 
    private void LoadFromEntityType(object data) 
    { 
     if (this.InvokeRequired) 
     { 
      this.BeginInvoke(new LoadFromEntityTypeDel(LoadFromEntityType), data); 
      return; 
     } 
     DataSource = data; 
    } 

    [BrowsableAttribute(false)] 
    [Description("This method checks if I run in DesignMode, because Threading doesn't work in the Designer")] 
    public bool IsDesignerHost 
    { 
     get 
     { 
      Control ctrl = this; 

      while (ctrl != null) 
      { 
       if ((ctrl.Site != null) && ctrl.Site.DesignMode) 
        return true; 
       ctrl = ctrl.Parent; 
      } 
      return false; 
     } 
    } 

    [Browsable(false)] 
    [Description("This method checks if I run in DesignMode, because Threading doesn't work in the Designer")] 
    public new static bool DesignMode 
    { 
     get 
     { 
      string processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName; 
      if (processName.Equals("devenv")) 
       return true; 
      return false; 
     } 
    } 
} 

どのように私はこれを行うことができますか?

答えて

0

ユーザがデザイナ(またはコード)で設定できる2つのプロパティ(つまり、表示メンバと値メンバ)がある場合、ベースクラス(UIComboBox)を呼び出してそれらの値を基本クラスに相当する

EDIT(コメントの後):

This linkがあなたに与えられたエンティティ(エンティティデータモデル、リフレクションを有する第二に対処1)の実体フィールドを得るための2つの方法を提供します。それはあなたの問題の半分を解決します。しかし、このフィールドの一覧をデザイナーにバインドする方法はわかりません。

+0

が、私はその部分を理解し、多分私の質問は、十分に明確ではなかったので、私は説明しよう: ときユーザーはEntityTypeを選択しますDisplayMemberとValueMemberの選択可能なリストとしてそのエンティティのすべてのEntityFieldを渡すことができるようにしたいと思います。 – Than

+0

私の編集を参照してください、多分それはあなたを助けるでしょう... – Shimrod

0

Net Frameworkでは、デザイン時の動作をいくつかの方法でカスタマイズできます。プロパティウィンドウにプロパティと値を入力する方法の1つは、TypeConverterオブジェクトです。カスタムTypeConverterを実装することでこれを機能させることができますが、選択可能なすべてのクラスをデコレートし、それぞれのタイプコンバータを提供する必要があります。

カスタムデザイナーを作成することで、カスタムコントロールのデザイン時の動作のあらゆる側面を広範囲に制御できます。カスタムデザイナーは、UIコントロールで使用するためにデータエンティティを変更するセミハックをスキップすることができます。代わりにエンティティ(Reflectionなど)を探索するための独自のコードを作成し、次にプロパティウィンドウを作成して選択することができます。カスタムデザイナーを作成することは自明ではなく、十分に文書化されていません。これは小売市場のコントロールを行うビジネスではないと仮定した場合の多くの作業ですが、ハッキングされていないデータエンティティで動作する「プロフェッショナルな」コントロールが必要な場合は、カスタムデザイナーが必要です。

確かに素晴らしい機能ですが、正に、いくつのプロパティがこれらのパラメータに適した候補でもあります。私はほとんど常に値のメンバーとして "Id"を持っていて、ディスプレイのメンバーは一般的に "Name"の順番にあるものです。データバインディングのフィールドを選択(および記憶)することは簡単ではなく、あなたがしたいことは退屈で時間がかかることがあります。しかし、あなたが試してみたい場合は...

この手順をどのように行うのかを誰も説明していないので、関連する例は見つけにくいでしょう。あなたがカスタムデザイナーに挑戦するとき、あなたはほとんどあなた自身のものです。ここでは、技術の研究を始めるための技術の概要紙です:

http://msdn.microsoft.com/en-us/magazine/cc164048.aspx#S5

関連する問題