DatagridView + ComboBox, finde Fehler nicht
Hallo @all,
ich habe ein (selbst erstelltes) Control. Es beinhaltet nur Navigationsbar, Datagridview und Bindingsource.
Dabei gibt es zwei ComboBox-Spalten. Die erste ist nur eine "normale" ComboBox für die Auswahl eines Landes.
Die zweite ist, soll, eine ComboBox-Spalte mit Eingabemöglichkeit sein. Sobald ein Eintrag nicht in der Liste der ComboBox gefunden wird, soll der Nutzer einen eigenen Eintrag schreiben, der dann (für später) in der Liste gespeichert wird.
Das funktioniert auch ganz gut, aber nach dem Dritten "öffnen" der ComboBoxListe, wird ein Fehler erzeigt, den ich leider nicht lokalisieren kann (also die Ursache).
Hier der Code:
Leider bekomme ich immer einen Fehler, dessen Ursache ich nicht finden kann.
Hat zufällig jemand eine Idee, wo ich den Denkfehler habe ?
Vielen Dank für Eure Hilfe
SH
ich habe ein (selbst erstelltes) Control. Es beinhaltet nur Navigationsbar, Datagridview und Bindingsource.
Dabei gibt es zwei ComboBox-Spalten. Die erste ist nur eine "normale" ComboBox für die Auswahl eines Landes.
Die zweite ist, soll, eine ComboBox-Spalte mit Eingabemöglichkeit sein. Sobald ein Eintrag nicht in der Liste der ComboBox gefunden wird, soll der Nutzer einen eigenen Eintrag schreiben, der dann (für später) in der Liste gespeichert wird.
Das funktioniert auch ganz gut, aber nach dem Dritten "öffnen" der ComboBoxListe, wird ein Fehler erzeigt, den ich leider nicht lokalisieren kann (also die Ursache).
Hier der Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
Public Class ctrlAnfrageTransportTabelle
Public Property TransportTabelle As New DataTable("TransportTabelle")
Public LänderListe As New DataTable
Public SpeditionListe As New DataTable
Private loadErr As Int16 = 0
Private TransportTabelle_bs As New BindingSource
Private Sub ctrlAnfrageTransportTabelle_Load(sender As Object, e As EventArgs) Handles MyBase.Load
LänderListe = appLänderListe.Copy 'eine DataTable aller Länder
SpeditionListe = appSpeditionen.Copy 'eine DataTable aller Spedition
If IsNothing(TransportTabelle) Then
BuildTransportTabelle()
ElseIf TransportTabelle.Columns.Count < 10 Then
TransportTabelle.Columns.Clear()
BuildTransportTabelle()
End If
'*** TestDaten einfügen (da Tabelle noch nicht aus Datenbank gefüllt wird
Dim _rw As DataRow = TransportTabelle.NewRow
_rw("LKZ") = "DE"
_rw("Spedition") = "BTG"
TransportTabelle.Rows.Add(_rw)
_rw = TransportTabelle.NewRow
_rw("LKZ") = "CH"
_rw("Spedition") = "Dachser"
TransportTabelle.Rows.Add(_rw)
'*** Testdaten-Ende ***
TransportTabelle_bs = New BindingSource
TransportTabelle_bs.DataSource = TransportTabelle
TransportTabelle_bn.BindingSource = TransportTabelle_bs
TransportTabelle_dgv.DataSource = TransportTabelle_bs
Application.DoEvents()
End Sub
Private Sub BuildTransportTabelle()
TransportTabelle.Columns.Add("LKZ", System.Type.GetType("System.String"))
TransportTabelle.Columns.Add("PLZ", System.Type.GetType("System.String"))
TransportTabelle.Columns.Add("Ort", System.Type.GetType("System.String"))
TransportTabelle.Columns.Add("Auflieferstelle", System.Type.GetType("System.String"))
TransportTabelle.Columns.Add("Spedition", System.Type.GetType("System.String"))
TransportTabelle.Columns.Add("GesGewichtKG", System.Type.GetType("System.Decimal"))
TransportTabelle.Columns.Add("Anzahlpaletten", System.Type.GetType("System.Int16"))
TransportTabelle.Columns.Add("GewLaufzeit", System.Type.GetType("System.String"))
TransportTabelle.Columns.Add("Preis", System.Type.GetType("System.Decimal"))
TransportTabelle.Columns.Add("SpedAngebotNr", System.Type.GetType("System.String"))
End Sub
''' <summary>
''' Passt das DGV an
''' </summary>
Public Sub FormatColumnsDgv()
'Spalte 1 - LKZ
Dim _tmpCol As New DataGridViewComboBoxColumn
With _tmpCol
.AutoComplete = True
.HeaderText = "Zielland"
.Name = "LKZ"
.DisplayIndex = 0
.DataPropertyName = "LKZ"
.DataSource = LänderListe
.ValueMember = "LKZ"
.DisplayMember = "Land"
.DropDownWidth = 200
.SortMode = DataGridViewColumnSortMode.Automatic
.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
End With
TransportTabelle_dgv.Columns.RemoveAt(0)
TransportTabelle_dgv.Columns.Insert(0, _tmpCol)
'Spalte 2 - PLZ
TransportTabelle_dgv.Columns("PLZ").HeaderText = "Ort"
TransportTabelle_dgv.Columns("PLZ").DisplayIndex = 1
TransportTabelle_dgv.Columns("PLZ").Name = "PLZ"
TransportTabelle_dgv.Columns("PLZ").Resizable = DataGridViewTriState.True
TransportTabelle_dgv.Columns("PLZ").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
'Spalte 3 - Ort
TransportTabelle_dgv.Columns("Ort").HeaderText = "PLZ"
TransportTabelle_dgv.Columns("Ort").DisplayIndex = 2
TransportTabelle_dgv.Columns("Ort").Name = "Ort"
TransportTabelle_dgv.Columns("Ort").Resizable = DataGridViewTriState.True
TransportTabelle_dgv.Columns("Ort").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
'Spalte 4 - Auflieferstelle
TransportTabelle_dgv.Columns("Auflieferstelle").HeaderText = "Auflieferstelle"
TransportTabelle_dgv.Columns("Auflieferstelle").DisplayIndex = 3
TransportTabelle_dgv.Columns("Auflieferstelle").Name = "Auflieferstelle"
TransportTabelle_dgv.Columns("Auflieferstelle").Resizable = DataGridViewTriState.True
TransportTabelle_dgv.Columns("Auflieferstelle").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
'Spalte 5a - Spedition für die Eingabe einer alternativen Spedition
TransportTabelle_dgv.Columns("Spedition").HeaderText = "Spedition"
TransportTabelle_dgv.Columns("Spedition").DisplayIndex = 4
TransportTabelle_dgv.Columns("Spedition").Name = "Spedition"
TransportTabelle_dgv.Columns("Spedition").Resizable = DataGridViewTriState.True
TransportTabelle_dgv.Columns("Spedition").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
'Spalte 5b - SpeditionAuswahl wenn in Liste
_tmpCol = New DataGridViewComboBoxColumn
With _tmpCol
.AutoComplete = True
.HeaderText = ""
.Name = "SpeditionAuswahl"
.DisplayIndex = 5
.DataPropertyName = "Spedition"
.DataSource = SpeditionListe
.ValueMember = "Spedition"
.DisplayMember = "Spedition"
.Width = 24
.DropDownWidth = 200
.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
.Resizable = DataGridViewTriState.False
.SortMode = DataGridViewColumnSortMode.Automatic
End With
TransportTabelle_dgv.Columns.Insert(5, _tmpCol)
'Spalte 6 - Ges Gewicht
TransportTabelle_dgv.Columns("GesGewichtKG").HeaderText = "Gesamtgewicht [kg]"
TransportTabelle_dgv.Columns("GesGewichtKG").DisplayIndex = 6
TransportTabelle_dgv.Columns("GesGewichtKG").Name = "GesGewichtKG"
TransportTabelle_dgv.Columns("GesGewichtKG").Resizable = DataGridViewTriState.True
TransportTabelle_dgv.Columns("GesGewichtKG").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
'Spalte 7 - Anz Palette
TransportTabelle_dgv.Columns("Anzahlpaletten").HeaderText = "Anzahl Paletten"
TransportTabelle_dgv.Columns("Anzahlpaletten").DisplayIndex = 7
TransportTabelle_dgv.Columns("Anzahlpaletten").Name = "AnzahlPaletten"
TransportTabelle_dgv.Columns("Anzahlpaletten").Resizable = DataGridViewTriState.True
TransportTabelle_dgv.Columns("Anzahlpaletten").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
'Spalte 8
TransportTabelle_dgv.Columns("GewLaufzeit").HeaderText = "gewünschte Laufzeit"
TransportTabelle_dgv.Columns("GewLaufzeit").DisplayIndex = 8
TransportTabelle_dgv.Columns("GewLaufzeit").Name = "GewLaufzeit"
TransportTabelle_dgv.Columns("GewLaufzeit").Resizable = DataGridViewTriState.True
TransportTabelle_dgv.Columns("GewLaufzeit").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
'Spalte 9
TransportTabelle_dgv.Columns("Preis").HeaderText = "Preis"
TransportTabelle_dgv.Columns("Preis").DisplayIndex = 9
TransportTabelle_dgv.Columns("Preis").Name = "Preis"
TransportTabelle_dgv.Columns("Preis").Resizable = DataGridViewTriState.True
TransportTabelle_dgv.Columns("Preis").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
'Spalte 10 - AngebotsNrSpedition
TransportTabelle_dgv.Columns("SpedAngebotNr").HeaderText = "Angebotsnr.Spedition"
TransportTabelle_dgv.Columns("SpedAngebotNr").DisplayIndex = 10
TransportTabelle_dgv.Columns("SpedAngebotNr").Name = "SpedAngebotNr"
TransportTabelle_dgv.Columns("SpedAngebotNr").Resizable = DataGridViewTriState.True
TransportTabelle_dgv.Columns("SpedAngebotNr").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
'Rest
TransportTabelle_dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
TransportTabelle_dgv.Columns("SpeditionAuswahl").Width = 24 'damit nur der ComboBox-Button angezeigt wird
End Sub
Private Sub TransportTabelle_dgv_DataError(sender As Object, e As DataGridViewDataErrorEventArgs) Handles TransportTabelle_dgv.DataError
Dim _row As Int64 = e.RowIndex
If TransportTabelle_dgv.Rows(_row).IsNewRow Then
e.Cancel = True
Exit Sub
End If
If loadErr = 0 Then
Select Case e.ColumnIndex
Case 5
Dim _sped As String = AsendiaFrameWork.NZ(TransportTabelle_dgv.Rows(_row).Cells(4).FormattedValue, "").ToString
Dim _rows() As DataRow = SpeditionListe.Select("Spedition LIKE '%1'".Replace("%1", _sped), "", DataViewRowState.CurrentRows)
If _rows.Count = 0 Then
If MessageBox.Show("Diese Spedition ist nicht in der Liste vorhanden.#Jetzt der Liste hinzufügen ?", "Spedition nicht in Liste...", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.No Then
If MessageBox.Show("Diese Spedition ist nicht in der Liste vorhanden.#Trotzdem im Datensatz speichern ?", "Spedition trotzdem speichern...", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.No Then
e.Cancel = False
Else
e.Cancel = True
End If
Else
Dim _rowSped As DataRow = SpeditionListe.NewRow
_rowSped("Spedition") = _sped
_rowSped("Activ") = 1
SpeditionListe.Rows.Add(_rowSped)
SpeditionListe.AcceptChanges()
'Neue alternative Spedition in DB speichern
Dim _Parameters As New Dictionary(Of String, Object)
_Parameters.Add("Spedition", _sped)
_Parameters.Add("Activ", 1)
appDBConnection.Insert2DB("AppSpeditionen", _Parameters) 'eigene Klasse zum Speichern in Datenbank
End If
End If
Case Else
Dim _colName As String = TransportTabelle_dgv.Columns(e.ColumnIndex).Name
Dim _colHeader As String = TransportTabelle_dgv.Columns(e.ColumnIndex).HeaderText
Dim _cellValue As String = ""
Dim _errMsg As String
If IsNothing(TransportTabelle_dgv.Rows(_row).Cells(e.ColumnIndex).Value) Then
_cellValue = "NOTHING"
ElseIf IsDBNull(TransportTabelle_dgv.Rows(_row).Cells(e.ColumnIndex).Value) Then
_cellValue = "NULL"
Else
Try
_cellValue = TransportTabelle_dgv.Rows(_row).Cells(e.ColumnIndex).Value.ToString
Catch ex As Exception
_cellValue = "undefinierter Zellinhalt"
End Try
End If
_errMsg = String.Format("Problem:{4:}Ein fehlerhafter Eintrag{4:} [{3}] {4:} in Zeile [{0:}] {4:} in der Spalte [{1:} / ({2:})] {4:}führt zu einer fehlerhaften Anzeige der Tabelle.{4:}{4:}Bitte korrigieren.", _row, _colName, _colHeader, _cellValue, vbCrLf)
MessageBox.Show(_errMsg, "Fehler !", MessageBoxButtons.OK, MessageBoxIcon.Error)
loadErr += 1
End Select
Else
End If
e.Cancel = True
End Sub
Private Sub TransportTabelle_dgv_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles TransportTabelle_dgv.CellValidating
Select Case e.ColumnIndex
Case 6, 7, 9
Dim _tmp As Double = 0
Dim _value As String = AsendiaFrameWork.NZ(TransportTabelle_dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).EditedFormattedValue, "0")
If Not Double.TryParse(_value, _tmp) Then
If String.IsNullOrEmpty(_value.Trim) Then
e.Cancel = False
Else
MessageBox.Show("Hier sind nur Zahlen zugelassen :)", "Fehlerchen...", MessageBoxButtons.OK, MessageBoxIcon.Hand)
e.Cancel = True
End If
End If
Case Else
e.Cancel = False
End Select
End Sub
Private Sub TransportTabelle_dgv_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles TransportTabelle_dgv.EditingControlShowing
Try
TransportTabelle_dgv.Columns("SpeditionAuswahl").Width = 24
Dim cb As ComboBox = TryCast(e.Control, ComboBox)
If cb.ValueMember <> "Spedition" Then Exit Sub
Dim columnName = TransportTabelle_dgv.Columns(TransportTabelle_dgv.CurrentCell.ColumnIndex).Name
If columnName = "SpeditionAuswahl" Then
RemoveHandler cb.SelectedIndexChanged, AddressOf ColumnComboSpedSelectionChanged
AddHandler cb.SelectedIndexChanged, AddressOf ColumnComboSpedSelectionChanged
End If
If cb IsNot Nothing Then
cb.DropDownStyle = ComboBoxStyle.DropDown
cb.DropDownWidth = 200
End If
Catch ex As Exception
End Try
End Sub
Private Sub ColumnComboSpedSelectionChanged(sender As Object, e As EventArgs)
Try
Dim sendingComboEdit = TryCast(sender, DataGridViewComboBoxEditingControl)
If IsNothing(sendingComboEdit.SelectedItem) Then Exit Sub
Dim selectedValue As String = sendingComboEdit.SelectedValue
Dim selectedItem As Int32 = sendingComboEdit.SelectedItem.row(0)
Dim _cell As DataGridViewComboBoxCell = TransportTabelle_dgv.SelectedCells(0)
Dim _nCell As DataGridViewTextBoxCell = TransportTabelle_dgv.Rows(_cell.RowIndex).Cells(4)
_nCell.Value = selectedValue
sendingComboEdit.EndUpdate()
TransportTabelle_dgv.EndEdit()
TransportTabelle_dgv.Rows(_cell.RowIndex).Cells(6).Selected = True
Application.DoEvents()
Catch ex As Exception
End Try
End Sub
End Class
Hat zufällig jemand eine Idee, wo ich den Denkfehler habe ?
Vielen Dank für Eure Hilfe
SH
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 2244397768
Url: https://administrator.de/forum/datagridview-combobox-finde-fehler-nicht-2244397768.html
Ausgedruckt am: 29.03.2025 um 19:03 Uhr
1 Kommentar