私は以下の問題に助けが必要です:他のプロパティから選択した値のインデックスを格納するプロパティを作成する方法は?
私は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のを表示することは可能でしょうか?代わりに、辞書型内で一緒に結ぶない理由を二つの別々の特性の
の値のみを受け入れるので、私はバイトのデータ型を使用します。残念ながら、GetStandardValuesは、少なくともhttp://msdn.microsoft.com/en-us/library/ayybcxe5.aspxに従って、プロパティ自体と同じ型の要素を持つコレクションを返す必要があります。コンボボックスをConvertFromまたはConvertToメソッドで表示するには、どのようにプロパティエディタを作成できますか? – starobrno
はい、GetStandardValuesはネイティブタイプ(バイト)を返します。そしてこれがコンボボックスを引き起こすものです。 ConvertFromとConvertToはカスタム文字列との変換を行うだけで、バイトではなく文字列がリストに表示されます。 –