Benutzer mit den meisten Antworten
DataGridView anpassen: Einfügen von Comboboxen

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)- Bearbeitet tommy_schroeder Mittwoch, 14. November 2012 09:15
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
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 14. November 2012 13:38
-
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- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 14. November 2012 13:37
- Tag als Antwort aufgehoben tommy_schroeder Mittwoch, 14. November 2012 13:44
- Als Antwort markiert tommy_schroeder Mittwoch, 14. November 2012 13:44
Alle Antworten
-
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
-
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
-
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
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 14. November 2012 13:38
-
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
-
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- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 14. November 2012 13:37
- Tag als Antwort aufgehoben tommy_schroeder Mittwoch, 14. November 2012 13:44
- Als Antwort markiert tommy_schroeder Mittwoch, 14. November 2012 13:44
-
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