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:
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/contentid/2244397768
Ausgedruckt am: 22.11.2024 um 05:11 Uhr
1 Kommentar