2009-06-12 3 views
3

Ich brauche Hilfe mit dem folgenden Problem:Wie erstellt man eine Eigenschaft, um den Index des ausgewählten Wertes aus einer anderen Eigenschaft zu speichern?

Ich habe eine Klasse mit zwei Eigenschaften.

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; } 
} 

Die PossibleValues ​​speichert die Liste der auswählbaren Werte. Der SelectedValue enthält den Index des aktuell ausgewählten Wertes.

In diesem Status zeigt der Eigenschafteneditor den Index des ausgewählten Werts an. Ich möchte den Wert mithilfe einer Combobox im Eigenschaftenraster auswählen, die mit einer Enum-Eigenschaft verwendet wird. Die Liste der Combobox würde von der PossibleValues-Eigenschaft gefüllt werden.

Mit Hilfe dieses Artikels (http://www.codeproject.com/KB/cpp/UniversalDropdownEditor.aspx) habe ich es geschafft, einen benutzerdefinierten Editor zu erstellen, der die Combobox im Eigenschaftenraster mit den Werten aus der PossibleValues-Eigenschaft anzeigt. Ich kann auch den Wert auswählen, aber das Eigenschaftsraster zeigt den Index des Werts anstelle des Werts selbst an.

Dies ist die modifizierte Quelle des Editors ist (original von Codeproject ist):

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(); 
    } 

} 

Natürlich braucht es weitere Modifikationen korrekt einige Situationen zu bewältigen (ex die Possible ist leer.).

So ist es möglich, die PossibleValues ​​[SelectedValue] anstelle des SelectedValue im Eigenschafteneditor anzuzeigen?

Antwort

1

Sie müssen einen benutzerdefinierten TypeConverter an Ihre SelectedValue-Eigenschaft anhängen und die PossibleValues ​​nicht durchsuchbar machen. Der TypeConverter wird dafür verantwortlich sein, Zeichenfolgen im PropertyGrid anstelle von Ints anzuzeigen. Im Grunde müssen Sie CanConvertFrom, CanConvertTo, ConvertFrom und ConvertTo überschreiben. Wenn Sie Ihre benutzerdefinierten Zeichenfolgen abrufen möchten, verwenden Sie das an diese Methoden übergebene Kontextargument und rufen Sie Ihre PossibleValues-Eigenschaft in Ihrer Zielinstanz auf. Das sollte es schaffen. Anscheinend benötigen Sie hier keinen benutzerdefinierten UITypeEditor.

+0

Ich dachte, dass die GetStandardValuesSupported und GetStandardValues ​​zum Anzeigen einer Combobox im Eigenschafteneditor verwendet werden. Leider müssen die GetStandardValues ​​eine Auflistung mit Elementen des gleichen Typs wie die Eigenschaft selbst zurückgeben, zumindest nach http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx. Wie kann ich den Eigenschaftseditor so konfigurieren, dass die Combobox mit den Methoden ConvertFrom oder ConvertTo angezeigt wird? – starobrno

+0

Ja, GetStandardValues ​​gibt den nativen Typ (Byte) zurück. Und das wird eine Combobox auslösen. ConvertFrom und ConvertTo führen einfach die Konvertierungen zu/von Ihren benutzerdefinierten Strings durch, so dass die Strings und nicht die Bytes in der Liste angezeigt werden. –

0

Anstatt zwei separate Eigenschaften, warum nicht verknüpfen Sie sie innerhalb eines Dictionary-Typs. So viel einfacher in diesem Fall zu verwenden. Mit Ihrem Index als Schlüssel und der Zeichenfolge [] als Werten. Beschränken Sie sich nicht auf ein Byte für den Index.

+0

Wenn ich die PossibleValues ​​von string [] zu Dictionary ändere, brauche ich noch eine Eigenschaft, um den aktuell ausgewählten Wert zu speichern. Die Anwendung verarbeitet Informationen von einem externen Gerät und nach der Verarbeitung wird die Information zurückgesendet. Ich benutze Byte-Datentyp, da dieses Gerät nur Werte von 0 bis 255 akzeptiert. – starobrno

Verwandte Themen