none
DataGridView anpassen: Einfügen von Comboboxen RRS feed

  • Frage

  • Hallo zusammen,

    ich versuche im Moment, eine DataGridView anzupassen und zwar dahingehend, dass eine Integer-Spalte durch eine Combobox ersetzt wird.

    Bin auch schon ziemlich weit, die "normale" Textspalte ist weg und stattdessen erscheint die Combobox, auch mit den richtigen Listeneinträgen.

    Aber:

    Die bereits in der Haupt-Tabelle vorhandenen Werte erscheinen nicht, und wenn ich versuche, meine Änderungen (durch Auswahl von Combobox-Werten) abzuspeichern, passiert nichts.

    Irgendwie fehlt noch die Verbindung zwischen Combobox und Haupttabelle. Kann mir jemand helfen?

    Gruß

    Thomas

    Dim var_connectionstring As String var_connectionstring = "Provider=" & global_variables.var_schroederstest_dbprovider & ";" & "Server=" & global_variables.var_schroederstest_dbserver & ";Initial Catalog=" & global_variables.var_schroederstest_db & ";" & "User Id=" & global_variables.var_schroederstest_dbuser & ";Password=" & global_variables.var_schroederstest_dbpass & ";Connection Timeout=300" Dim var_connection As New OleDbConnection(var_connectionstring)
    var_datagridview_03_dataset01.Tables.Add(var_datagridview_03_datatable01) var_datagridview_03_oledbdataadapter01 = New OleDbDataAdapter("SELECT * FROM tblHoflisteBenutzer", var_connectionstring) var_datagridview_03_oledbdataadapter01.Fill(var_datagridview_03_datatable01) Dim var_oledbcommandbuilder01 As New OleDbCommandBuilder(var_datagridview_03_oledbdataadapter01) var_datagridview_03_bindingsource01.DataSource = var_datagridview_03_datatable01 frm_hauptmaske.datagridview_03.DataSource = var_datagridview_03_bindingsource01         Dim var_combobox As New DataGridViewComboBoxColumn var_datagridview_03_dataset02.Tables.Add(var_datagridview_03_datatable02) var_datagridview_03_oledbdataadapter02 = New OleDbDataAdapter("SELECT Nummer, Firma FROM tblHoflisteBenutzer_Test01_Firma", var_connectionstring) var_datagridview_03_oledbdataadapter02.Fill(var_datagridview_03_datatable02) Dim var_oledbcommandbuilder02 As New OleDbCommandBuilder(var_datagridview_03_oledbdataadapter02) Dim var_index As Integer var_index = var_datagridview_03_dataset01.Tables(0).Columns.IndexOf("Nummer") frm_hauptmaske.datagridview_03.Columns.Remove("Nummer") var_combobox.Name = "Nummer" var_combobox.DataSource = var_datagridview_03_datatable02 var_combobox.ValueMember = "Nummer" var_combobox.DisplayMember = "Firma" frm_hauptmaske.datagridview_03.Columns.Insert(var_index, var_combobox)

    Mittwoch, 14. November 2012 09:14

Antworten

  • Hallo Thomas,

    in der DataPropertyName Eigenschaft muss der Spaltenname der Haupttabelle (hier wohl var_datagridview_03_datatable01) stehen; also die die durch vom DataGridView aktualisiert werden soll.

    Ob der Name gleich ist, hängt davon ab, wie Du die Spalten in der DataTable genannt hast. Die Datentypen von ValueMember und DataPropertyName müssen kompatibel sein, also z. B. beide Integer. Sinnvollerweise gibt es eine Datenbank-Relation zwischen den Tabellen.

    Am besten siehst Du das wenn Du Dir mal ein DataGridView im Designer erzeugst und den Code in InitializeComponent anschaust, der dazu erzeugt wird.

    Gruß Elmar

    Mittwoch, 14. November 2012 10:45
    Beantworter
  • Mit den Angaben erzeugst Du eine Master-Child-Beziehung. Master ist die Nachschlagetabelle (bei Dir var_datagridview_03_datatable02), Child ist die Tabelle, die im Grid angezeigt wird (bei Dir var_datagridview_03_datatable01). Im Master muss es eine Spalte mit unikaten Werten geben, auf die vom Child referenziert wird. Im Child muss es eine Fremdschlüsselspalte geben, die auf die Werte in Master verweist und die Werte müssen im Master vorhanden sein.
     
    Wenn das gestört ist, d.h. keine unkaten Werte im Master, Verweis aus dem Child auf Werte im Master, die dort fehlen, dann hagelt es die Fehler.
     
    --
    Viele Gruesse
    Peter
    Mittwoch, 14. November 2012 12:19

Alle Antworten

  • Es fehlt die Bindung an die Fremdschlüsselspalte der Kindtabelle.
     
    --
    Viele Gruesse
    Peter
    Mittwoch, 14. November 2012 09:57
  • Hallo Tommy,

    damit die DataGridViewComboBoxColumn an die Daten gebunden wird, musst Du die DataPropertyName-Eigenschaft auf den Namen der Spalte der "Haupttabelle" einstellen.

    Gruß Elmar

    Mittwoch, 14. November 2012 09:58
    Beantworter
  • Hallo zusammen,

    habe ich verstanden, aber wenn ich das tue (das Quell- bzw. Zielfeld bei dieser Eigenschaft eingebe) hagelt es drei Millionen Fehlermeldungen:

    Standard-Fehlerdialogfeld für DataGridView
    DataGridView-Ausnahme:
    System.ArgumentException: Der DataGridViewComboBoxCell-Wert ist ungültig.
    Behandeln Sie das DataError-Ereignis, um dieses Standarddialogfeld zu ersetzen.

    Kann es daran liegen, dass die beiden Schlüsselfelder gleich heißen? (was ja ziemlich oft der Fall ist)

    Gruß

    Thomas

    Mittwoch, 14. November 2012 10:33
  • Hallo Thomas,

    in der DataPropertyName Eigenschaft muss der Spaltenname der Haupttabelle (hier wohl var_datagridview_03_datatable01) stehen; also die die durch vom DataGridView aktualisiert werden soll.

    Ob der Name gleich ist, hängt davon ab, wie Du die Spalten in der DataTable genannt hast. Die Datentypen von ValueMember und DataPropertyName müssen kompatibel sein, also z. B. beide Integer. Sinnvollerweise gibt es eine Datenbank-Relation zwischen den Tabellen.

    Am besten siehst Du das wenn Du Dir mal ein DataGridView im Designer erzeugst und den Code in InitializeComponent anschaust, der dazu erzeugt wird.

    Gruß Elmar

    Mittwoch, 14. November 2012 10:45
    Beantworter
  • Hallo Elmar,

    beide Spalten heißen im SQL Server "Nummer" und haben den Datentyp nvarchar(50).

    Und ich habe die beiden Eigenschaften entsprechend gesetzt:

       var_combobox.DisplayMember = "Nummer"

       var_combobox.DataPropertyName = "Nummer"


    Ich verstehe nicht, was ich falsch mache.

    Sagtest Du, ich muss in der DataTable irgendwas machen?

    Gruß

    Thomas

    Mittwoch, 14. November 2012 10:55
  • Mit den Angaben erzeugst Du eine Master-Child-Beziehung. Master ist die Nachschlagetabelle (bei Dir var_datagridview_03_datatable02), Child ist die Tabelle, die im Grid angezeigt wird (bei Dir var_datagridview_03_datatable01). Im Master muss es eine Spalte mit unikaten Werten geben, auf die vom Child referenziert wird. Im Child muss es eine Fremdschlüsselspalte geben, die auf die Werte in Master verweist und die Werte müssen im Master vorhanden sein.
     
    Wenn das gestört ist, d.h. keine unkaten Werte im Master, Verweis aus dem Child auf Werte im Master, die dort fehlen, dann hagelt es die Fehler.
     
    --
    Viele Gruesse
    Peter
    Mittwoch, 14. November 2012 12:19
  • Hallo Peter,

    Du hattest recht, genau das war's. In der Basistabelle (die, die im DataGrid editiert werden soll) standen Schlüsselwerte drin, die in der anderen Tabelle nicht vorkamen. Ich habe jetzt bereinigt und jetzt kommen auch keine Fehlermeldungen vor.

    Schönen Dank und Gruß aus dem Schwabenland

    Thomas

    Mittwoch, 14. November 2012 13:20