2009-06-12 9 views
3

私は以下の問題に助けが必要です:他のプロパティから選択した値のインデックスを格納するプロパティを作成する方法は?

私は2つのプロパティを持つクラスを持っています。

private byte m_selectedValue; 
public byte SelectedValue 
{ 
    get { return m_selectedValue; } 
    set { m_selectedValue = value; } 
} 

private string[] m_possibleValues; 
public string[] PossibleValues 
{ 
    get { return m_possibleValues; } 
    set { m_possibleValues = value; } 
} 

PossibleValuesには、選択可能な値のリストが格納されます。 SelectedValueには、実際に選択された値のインデックスが含まれます。

この状態でプロパティエディタが選択された値のインデックスを示しています。プロパティのグリッドで、Enumプロパティで使用されているのと同じスタイルのコンボボックスを使用して値を選択したいと思います。コンボボックスのリストはPossibleValuesプロパティから設定されます。

この記事(http://www.codeproject.com/KB/cpp/UniversalDropdownEditor.aspx)の助けを借りて、プロパティグリッドのコンボボックスにPossibleValuesプロパティの値を表示するカスタムエディタを作成することができました。値を選択することもできますが、プロパティグリッドには値自体ではなく値のインデックスが表示されます。

これは、エディタの変更されたソース(元はCodeProjectのからである)である。もちろん

public class EnumParamValuesEditor : UITypeEditor 
{ 
    private IWindowsFormsEditorService edSvc; 

    public override UITypeEditorEditStyle GetEditStyle(System.ComponentModel.ITypeDescriptorContext context) 
    { 
     if ((context != null) && (context.Instance != null)) 
      return UITypeEditorEditStyle.DropDown; 
     return UITypeEditorEditStyle.None; 
    } 

    public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     if ((context == null) || (provider == null) || (context.Instance == null)) 
      return base.EditValue(provider, value); 
     edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 
     if (edSvc == null) 
      return base.EditValue(provider, value); 
     ListBox lst = new ListBox(); 
     PrepareListBox(lst, context); 
     lst.SelectedIndex = (byte)value; 
     edSvc.DropDownControl(lst); 
     if (lst.SelectedItem == null) 
      value = null; 
     else 
      value = (byte)lst.SelectedIndex; 
     return value; 
    } 

    private void PrepareListBox(ListBox lst, ITypeDescriptorContext context) 
    { 
     lst.IntegralHeight = true; 
     string[] coll = ((EnumTerminalParam)context.Instance).PossibleValues; 
     if (lst.ItemHeight > 0) 
     { 
      if ((coll != null) && (lst.Height/lst.ItemHeight < coll.Length)) 
      { 
       int adjHei = coll.Length * lst.ItemHeight; 
       if (adjHei > 200) 
        adjHei = 200; 
       lst.Height = adjHei; 
      } 
     } 
     else 
      lst.Height = 200; 
     lst.Sorted = true; 
     FillListBoxFromCollection(lst, coll); 
     lst.SelectedIndexChanged += new EventHandler(lst_SelectedIndexChanged); 
    } 

    void lst_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (edSvc == null) 
      return; 
     edSvc.CloseDropDown(); 
    } 

    public void FillListBoxFromCollection(ListBox lb, ICollection coll) 
    { 
     lb.BeginUpdate(); 
     lb.Items.Clear(); 
     foreach (object item in coll) 
      lb.Items.Add(item); 
     lb.EndUpdate(); 
     lb.Invalidate(); 
    } 

} 

、それは正しく、いくつかの状況を処理するためにさらに変更を必要とする(例:PossibleValuesは空です。)。

だから、プロパティエディタでPossibleValues [SelectedValueの]の代わりに、SelectedValueのを表示することは可能でしょうか?代わりに、辞書型内で一緒に結ぶない理由を二つの別々の特性の

答えて

1

あなたのSelectedValueのプロパティにカスタムのTypeConverterを添付しPossibleValuesは非ブラウズ可能にする必要があります。 TypeConverterはintの代わりにPropertyGridに文字列を表示します。基本的に、CanConvertFrom、CanConvertTo、ConvertFrom、およびConvertToをオーバーライドする必要があります。カスタム文字列を取得するには、これらのメソッドに渡されたコンテキスト引数を使用し、ターゲットインスタンスのPossibleValuesプロパティを呼び出します。それはそれを作るはずです。ここにカスタムUITypeEditorは必要ないと思われます。

+0

の値のみを受け入れるので、私はバイトのデータ型を使用します。残念ながら、GetStandardValuesは、少なくともhttp://msdn.microsoft.com/en-us/library/ayybcxe5.aspxに従って、プロパティ自体と同じ型の要素を持つコレクションを返す必要があります。コンボボックスをConvertFromまたはConvertToメソッドで表示するには、どのようにプロパティエディタを作成できますか? – starobrno

+0

はい、GetStandardValuesはネイティブタイプ(バイト)を返します。そしてこれがコンボボックスを引き起こすものです。 ConvertFromとConvertToはカスタム文字列との変換を行うだけで、バイトではなく文字列がリストに表示されます。 –

0

。この場合、ずっと使いやすくなります。索引をキーとして、文字列[]を値として使用します。インデックスのバイトに自分自身を制限しないでください。

+0

私は辞書に[]文字列からPossibleValuesを変更した場合、私はまだ現在選択されている値を格納するプロパティを必要としています。アプリケーションは外部デバイスからの情報を処理し、処理後に情報が戻されます。このデバイスは、私がGetStandardValuesSupportedとGetStandardValuesは、プロパティエディタでのコンボボックスを表示するために使用されていることを考え、0から255 – starobrno

関連する問題