Announcement

Collapse
No announcement yet.

Combobox in Datagridview

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

  • Combobox in Datagridview

    Hallo

    Ich versuche eine Combobox in einem Datagridview einzublenden und bekomme es irgendwie einfach nicht hin. Ich erhalte jeweils die Fehlermeldung "System.FormatException: Der DatagridviewComboboxCell-Wert ist ungültig.".

    Ich bin so vorgegangen, dass ich ein DataSet (DS1) mit all den Daten erstellt habe, welche im Datagridview angezeigt werden sollen. Dieses habe ich dann mit dem DGV verbunden. Nun habe ich ein zweites DataSet (DS2) erstellt, in welchem ich die Daten für die Combobox zusammenfasse. Danach habe ich dem DGV über den Editor eine neue Spalte vom Typ Combobox hinzugefügt. Unter DataSource habe ich das DS2 ausgewählt. Bei DisplayMember den Wert aus DS2, welcher angezeigt werden soll und unter ValueMember den Index aus DS2. Als DataPropertyName habe ich den Wert aus DS1 genommen, der gleich dem DisplayMember aus DS2 ist.

    Hat jemand eine Idee, was da nicht stimmt. Komme leider nicht mehr weiter.

    Danke und Gruss
    Roland

  • #2
    Hallo Roland,

    zwei getrennte DataSets sind nicht erforderlich. Es genügt ein DataSet mit zwei DataTables: die Hauptdaten stehen in der einen, die Nachschlagewerte in der anderen.

    Die Beschreibung Deines Vorgehens klingt zumindest plausibel. (Mit Code könnte man das genauer prüfen.) Vergleiche einmal Deinen Code mit meinem Beispiel unter DataGridView: Master/Detail über ComboBox; vielleicht findest Du dabei bereits einen Fehler.

    Verwirrend finde ich die Fehlermeldung "System.FormatException: Der DatagridviewComboboxCell-Wert ist ungültig." Das deutet für mich eher darauf hin, dass ein Wert in einer Zeile der Haupttabelle nicht zulässig ist. Handelt es sich vielleicht um einen null-Wert?

    Viel Erfolg! Jürgen

    Comment


    • #3
      Hallo Jürgen

      Danke für die Hilfe. Leider habe ich es noch nicht hinbekommen. Den Code kann ich dir nicht liefern, da ich keinen habe. Die ComboBox habe ich über die Datagridview-Aufgaben konfiguriert. Den Tip bezüglich dem NULL-Wert habe ich auch nochmals überprüft. Aber leider sind alles gültige Werte in den Tabellen...
      Keinen Fehler erhalte ich, wenn ich keinen Wert bei DataPropertyName angebe. Dann steht jedoch auch kein Wert in der Combobox. Sobald ich dort einen Wert angebe, steht was in der Combobox, aber ich erhalte den Fehler. Eventuell noch ein Tip?

      Danke und Gruss
      Roland

      Comment


      • #4
        Hallo Roland,
        Originally posted by roland76 View Post
        Den Code kann ich dir nicht liefern, da ich keinen habe. Die ComboBox habe ich über die Datagridview-Aufgaben konfiguriert.
        Entschuldigung, aber das ist Quatsch. Wenn Du das programmierst, gibt es auch Code. Der Designer speichert so etwas in einer MyForm.Designer.cs ab.
        Originally posted by roland76 View Post
        Sobald ich dort einen Wert angebe, steht was in der Combobox, aber ich erhalte den Fehler. Eventuell noch ein Tip?
        Es könnte an einer falschen Reihenfolge der Befehle liegen. (Der Designer sollte es eigentlich richtig machen; aber der hat noch viele andere Punkte zu beachten.) Relevant sind alle Befehle, die sich auf die Spalten und die Verbindungen zwischen DGV und DataTable beziehen.

        Ich erinnere mich, dass ich mir einmal nicht anders helfen konnte, als alle Festlegungen für das DGV in der Designer.cs zu löschen und manuell im FormLoad-Ereignis zu steuern, nachdem die Daten zur Verfügung standen.

        Gruß Jürgen

        Comment


        • #5
          Hallo Jürgen

          Beim Punkt mit dem Code hast du natürlich recht. Wusste es leider nicht.

          Ich habe nun alle Objekte gelöscht und die Datatables und die ComboboxSpalte neu gecoded. Rausgekommen ist der untenstehende Code. Neu habe ich nun keinen Fehler mehr, was schon mal ein Fortschritt ist. Leider bekomme ich in der Combobox aber nur einen Eintrag und zwar der, der in der Table als erster steht. Klicke ich auf die Combobox, passiert rein gar nichts.

          Code:
                      // Abfragen definieren
                      string strSQL = "SELECT ac_seller.seller_name, ac_sales.product_name, " +
                                      "ac_sales.sales_date, ac_sales.quantity, ac_sales.price, " +
                                      "ac_sales.id_product, ac_sales.id_manufacturer, " +
                                      "ac_products.id_product AS id_produkttyp, " +
                                      "ac_products.productname AS produkttyp, " +
                                      "ac_manufacturers.id_manufacturer AS id_manu, " +
                                      "ac_manufacturers.manufacturername AS manu " +
                                      "FROM ac_products " +
                                      "INNER JOIN ac_sales ON ac_products.id_product = ac_sales.id_product " +
                                      "INNER JOIN ac_manufacturers ON ac_sales.id_manufacturer = ac_manufacturers.id_manufacturer " +
                                      "INNER JOIN ac_auctions ON ac_sales.id_auction = ac_auctions.id_auction " +
                                      "INNER JOIN ac_seller ON ac_auctions.id_seller = ac_seller.id_seller " +
                                      "ORDER BY ac_sales.sales_date;" +
                                      "SELECT id_product AS id_produkttyp, productname AS produkttyp FROM ac_products";
          
                      // SqlDataAdapter erstellen
                      SqlDataAdapter da = new SqlDataAdapter(strSQL, con);
                      da.TableMappings.Add("Table", "OffeneSales");
                      da.TableMappings.Add("Table1", "Produkttypen");
          
                      // Dataset erstellen und abfüllen
                      DataTable table = new DataTable("OffeneSales");
                      da.Fill(table);
                      DataTable tableprod = new DataTable("Produkttypen");
                      da.Fill(tableprod);
          
                      // Datasource für DGV definieren
                      dgvOffeneSales.DataSource = table;
          
                      // ComboboxColumn hinzufügen
                      DataGridViewComboBoxColumn cmbProduktetyp = new DataGridViewComboBoxColumn();
                      cmbProduktetyp.HeaderText = "Produktetyp";
                      cmbProduktetyp.DataSource = tableprod;
                      cmbProduktetyp.DisplayMember = tableprod.Columns["produkttyp"].ToString();
                      cmbProduktetyp.ValueMember = tableprod.Columns["id_produkttyp"].ToString();
                      cmbProduktetyp.DataPropertyName = table.Columns["id_product"].ToString();
          
          
                      dgvOffeneSales.Columns.Add(cmbProduktetyp);
          Irgendeine Idee, damit ich nicht nur einen Eintrag in der Combobox erhalte, sondern alle, die sich in der Table befinden?

          Danke und Gruss
          Roland

          Comment


          • #6
            Hallo Roland,

            danke für diese Informationen. Mit TableMappings habe ich noch nicht gearbeitet; deshalb weiß ich nicht, ob so ein Verfahren grundsätzlich möglich ist.

            Nach meinem Verständnis benötigst Du für jede Tabelle einen eigenen DbDataAdapter mit Select-String und Fill-Befehl. (Wenn derselbe Befehl mehrfach auf verschiedene Tabellen angewendet wird, landen dieselben Daten doppelt im DataSet.) Für die Nachschlagetabellen werden alle Einträge geholt (i.d.R. beschränkt auf ID+Name), für die Arbeitsdaten nur die konkret benötigten. JOIN hat dabei i.d.R. nichts zu suchen; das wird durch DataRelations (entspricht ForeignKey) ersetzt.

            Ich hoffe, es hilft Dir weiter. Jürgen

            Comment


            • #7
              Hallo Jürgen

              Danke für deine Antworten. Es funktioniert nun. Der Code war grundsätzlich richtig. Das Problem lag am Datagridview. Ich habe dieses mal gelöscht und neu erstellt. Und schon funktioniert es... Manchmal geht es eben einfacher als man meint. :-)

              Gruss
              Roland

              Comment

              Working...
              X