sachsenhessi
Goto Top

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).
dgv-1
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
Leider bekomme ich immer einen Fehler, dessen Ursache ich nicht finden kann.
dgv-2
Hat zufällig jemand eine Idee, wo ich den Denkfehler habe ?
Vielen Dank für Eure Hilfe
SH

Content-ID: 2244397768

Url: https://administrator.de/forum/datagridview-combobox-finde-fehler-nicht-2244397768.html

Ausgedruckt am: 22.12.2024 um 10:12 Uhr

SachsenHessi
Lösung SachsenHessi 22.03.2022 aktualisiert um 10:38:37 Uhr
Goto Top
So, ich antworte mir mal wieder selber.
Schuld war <TransportTabelle_dgv.EndEdit()> face-sad

Obwohl das beim Debuggen nicht erkennbar war face-sad
Und die Fehlermeldung nix genaues sagt. Das Programm ist einfach, kommentarlos abgestürzt.

LG
SH