Announcement

Collapse
No announcement yet.

Werte aus Enum in Tabelle wählen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Werte aus Enum in Tabelle wählen

    Hallo Experten,

    ich habe ein DataGridView, das auch DataGridViewComboBoxColumns enthält. Die werden so erstellt:[highlight="c#"]
    public enum MyEnum
    {
    None,
    First,
    Second,
    Third,
    Fourth,
    Fifth
    }

    for(int comboColumnIndex = 0; comboColumnIndex < comboColumnCount; comboColumnIndex++)
    {
    int columnIndex = myDataGridView.Columns.Add(new DataGridViewComboBoxColumn());
    myDataGridView.Columns[columnIndex].Name = "Combo" + comboColumnIndex.ToString();
    ((DataGridViewComboBoxColumn)(myDataGridView.Colum ns[columnIndex])).DataSource = Enum.GetValues(typeof(MyEnum));
    }
    [/highlight]Später werden dann Zeilen erzeugt[highlight="c#"]
    for (int i = 0; i < 10; i++)
    {
    int rowIndex = myDataGridView.Rows.Add();
    myDataGridView.Rows[rowIndex].HeaderCell.Value = (i + 1).ToString();

    for (int comboColumnIndex = 0; comboColumnIndex < _comboColumnCount; comboColumnIndex++)
    myDataGridView.Rows[rowIndex].Cells["Combo" + comboColumnIndex.ToString()].Value = MyEnum.None;
    }[/highlight]

    Fürs Erste scheint das zu funktionieren. Aber nur solange, bis der Benutzer einen ComboBox-Wert geändert hat. Von da an mündet jedes Neuzeichnen der Zelle in einer Fehlermeldung
    DataGridView-Ausnahme:
    System.ArgumentException: der DataGridViewComboBoxCell-Wert ist ungültig.
    Behandeln Sie das DataError-Ereignis, um dieses Standarddialogfeld zu ersetzen.
    Wie mache ich es richtig, Spalten zu erzeugen, deren Zellen Comboboxen mit den Auswahlmöglichkeiten aus MyEnum sind?

    Ich sag schonmal Danke im Voraus,


    luker

  • #2
    Hallo,

    verwende besser Datenbindung anstatt die Zeilen manuell hinzuzufügen.
    Wenn es Probleme mit dem Enum gibt kann im gebundenen Model auch speziellere Eigenschaften angeboten werden und gegen diese gebunden werden.

    Sonst gibts beim Enum ja auch noch die statischen Methoden Parse, TryParse, etc.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Originally posted by gfoidl View Post
      verwende besser Datenbindung
      Ich hoffe, an der Stelle[highlight="c#"]((DataGridViewComboBoxColumn)(myDataGridView.Colum ns[columnIndex])).DataSource = Enum.GetValues(typeof(MyEnum));[/highlight]habe ich das bereits getan.

      Wie sähe Datenbindung an so etwas[highlight="c#"]myDataGridView.DataSource = datenHaltungsObjekt;

      datenHaltungsObjekt = new List<datenZeilenKlasse>;

      objekt datenZeilenKlasse
      {
      public string Name{get;set;}

      public List<bool> EinAus = new List<bool>(16);
      public List<MyEnumWert> = new List<MyEnumWert>(4);
      }

      public enum MyEnum
      {
      None,
      First,
      Second,
      Third,
      Fourth,
      Fifth
      }[/highlight]denn aus?
      Ich kann mir einfach nicht vorstellen, dass obige erste Zeile schon genügt.

      Comment


      • #4
        Hallo,

        ich meinte eher so wie es in How to: Bind Objects to Windows Forms DataGridView Controls beschrieben ist.


        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Wenn ich nun in jeder Zeile 16 Checkboxen haben will, dann vermute ich, im "business object" werde ich 16 bool-Properties benötigen, richtig?

          Bis dato verwende ich eine List<bool>(16). Wie könnte die BindingSource darauf zugreifen?

          Comment


          • #6
            Was stellt denn bitte eine List<bool>(16) dar? Das kommt immer auf den Anwendungsfall an. Aber wenn ich eine Liste mit fester größe habe würde ich glaube ich ein Array verwenden. Finde ich an der Stelle intuitiver.
            Ausserdem solltest Du dann für die Anzeige ein anderes Objekt verwenden, was Dir Deine Daten im Businessobjekt für die Anzeige aufbereitet (ViewModel). Ich hab das zumindest in meiner aktuellen Anwendung so.

            also praktisch:

            [highlight=c#]
            public class MyBusinessObject
            {
            private bool[] _einAus = new bool[16];

            public bool[] EinAus { get { return _einAus; } }
            }

            public class MyBusinessObjectViewModel
            {
            private readyonly MyBusinessObject _businessObject;

            public MyBusinessObjectViewModel(MyBusinessObject myBusinessObject)
            {
            _businessObject = myBusinessObject;
            }

            public bool EinAus1
            {
            get { return _einAus[0]; }
            set { _einAus[0] = value; }
            }

            public bool EinAus2
            {
            get { return _einAus[1]; }
            set { _einAus[1] = value; }
            }

            //andere analog
            //...
            }
            [/highlight]

            Das spiegelt genau das Verhalten wie Du es von der UI erwartest und das lässt sich dann auch ganz einfach an die UI binden.

            Comment


            • #7
              Originally posted by fanderlf View Post
              Was stellt denn bitte eine List<bool>(16) dar?
              In diesem Fall handelt es sich um die Schaltzustände (offen/geschlossen) von 16 Relais.

              Es wird also auf 16 nahezu identische Properties hinauslaufen. Das halte ich weder für elegant, noch fühle ich mich auf die Möglichkeit vorbereitet, dass nächste Woche doch noch 3 Relais mehr benötigt werden könnten. Das bedeutete dann wohl eine zweite Relaiskarte und ich müsste im Code 16 weitere Properties hinzufügen.

              Mir leuchtet der Vorteil gegenüber der Spaltenerzeugung aus dem Ursprungsposting nicht ein, mal abgesehen von den Ausnahmen zur Laufzeit.

              Wie könnte man denen eventuell begegnen?

              Comment


              • #8
                Ist denn für Dein Vorhaben wirklich das DataGridView das Richtige? Eventuell könnte man auch ein selbst gebasteltes UserControl nehmen was für jedes Item in Deiner Liste/Array eine CheckBox erzeugt.
                Dynamische Spaltenerstellung aus Arrays ist nicht gerade die Stärke des DataGridView. Vielleicht kannst Du ja auch einen eigenen DataGridViewColumn Typ für ein bool[] erstellen, was für jeden Wert darin eine CheckBox anzeigt, aber innerhalb einer Spalte.

                Comment

                Working...
                X