Probleme mit ComboBox im DataGrid

SixDark

Erfahrenes Mitglied
Hallo Tutorials-Leser!

Ich habe ein Problem mit einer ComboBox-Spalte im DataGrid. Und zwar funktioniert der Übertrag des ComboBox-Inhaltes nach einer Änderung nur dann wenn ich die TAB-Taste drücke. Wenn ich zum Beispiel in die nächste Zeile klicke, dann wird die Änderung nicht in die DataGrid-Zelle übernommen und die DataGrid-Zelle bleibt leer, obwohl vorher ein Wert drin stand.

Woran könnte das liegen? Bastle da nun schon seit vielen Stunden dran rum und krieg es irgendwie nicht hin. Hab auch schon im Web gesucht aber keine Lösung dafür gefunden.

Bin für jeden Tip dankbar!

MfG
..::Six Dark::..
 
Ok, habs inzwischen selbst hinbekommen...
Wer Interesse an einer ComboBox für sein DataGrid ist kann sich ja melden, dann poste ich den Code gern (der ist allerdings nicht komplett von mir selber geschrieben, hab nur einige Änderungen vorgenommen und einige Bugs entfernt...). Kann man natürlich auch unter C# nutzen bzw. dahin übersetzen.

MfG
..::Six Dark::..
 
Hallo,

ne ComboBox im DataGrid würde ich auch gerne hinkriegen.
Würde mich über Deine Infos freuen.

Danke Gruß
Holgi
 
Hi!

Wenn Du mir mal Deine Mail-Addy mitteilst, dann schick ich Dir mal eine Beschreibung und den Code für die ComboBox-Klasse.

MfG
..::SD::..
 
Hi.

Wenn es nicht viel ist poste den Code doch gleich hier, der hänge eine Datei mit dem Sourcecode an. Dann belästigt dich später keiner via E-Mail.

Mfg,
Alex
 
Hallo!

Also gut, dann gibt’s hier mal den Code und ein paar Erklärungen dazu! Aber ich muß dazu sagen, dass der Code noch einige Probleme hat. Nähere Beschreibung folgt:

Und zwar tritt ein Fehler auf wenn man eine neue Zeile in dem DataGrid hinzufügen soll. Ich nehme mal an das passiert deshalb, weil die ComboBox versucht Daten darzustellen, aber in einer neuen Zeile ja noch gar keine Daten in der Spalte vorhanden sind. Leider konnte ich den Fehler bisher nicht isolieren. Ich habe das Problem wie folgt gelöst. Wenn jemand im DataGrid eine neue Zeile hinzufügen möchte, wird automatisch die folgende Funktion aufgerufen und in die jeweilige Spalte wird mit einem Leerzeichen gefüllt:

Code:
    Private Sub makeNewLine(ByVal p_Point As System.Drawing.Point)
        Dim ro As System.Data.DataRow
        Try
            Dim s As String
            s = myDTl.Rows(p_Point.Y).Item("Firmenname")
        Catch
            Try
                ro = myDTl.NewRow
                ro("Land") = ""
                myDTl.Rows.Add(ro)
            Catch ee As Exception
                MsgBox(ee.Message, MsgBoxStyle.OKOnly, "Fehler...")
            End Try
        End Try
    End Sub

Und nun zur Erklärung:
Die Spalte Firmenname ist bei mir im Beispiel die erste Spalte im DataGrid. Es wird also versucht beim Zeilenwechsel diese erste Spalte auszulesen. Steht in der Spalte etwas drin, macht er gar nix. Steht in der Spalte jedoch nix drin (wie das eben bei einer neuen Zeile so ist), dann wird der Catch-Block ausgeführt. Die Spalte ‚Land’ ist hier die Spalte mit der ComboBox. Diese wird mit einem Leerzeichen befüllt und somit steht etwas drin und der Fehler (wie oben genannt) wird nicht ausgelöst. Ist etwas kompliziert, aber es funktioniert!

Im Load-Ereignis der jeweiligen Form fügst Du folgende Zeile ein, wobei grdSchnellLand das DataGrid darstellt:

Code:
AddHandler grdSchnellLand.CurrentCellChanged, AddressOf Grid_CurCellChange

Dann schreibst Du die Sub-Routine Grid_CurCellChange:

Code:
    Protected Sub Grid_CurCellChange(ByVal sender As Object, ByVal e As EventArgs)
        oldPoint = newPoint   'oldPoint = Zelle wo vorher der Cursor war;; newPoint = Zelle wo jetzt der Cursor ist
        newPoint = New System.Drawing.Point(Me.grdSchnellLand.CurrentCell.ColumnNumber, Me.grdSchnellLand.CurrentCell.RowNumber)

        If oldPoint.X = newPoint.X And newPoint.Y <> oldPoint.Y Then
            If Me.grdSchnellLand.Item(newPoint.Y, 0).ToString = System.String.Empty Or Me.grdSchnellLand.Item(newPoint.Y, 1).ToString = System.String.Empty Or Me.grdSchnellLand.Item(newPoint.Y, 2).ToString = System.String.Empty Then
                Call makeNewLine(newPoint)
            End If
            Exit Sub
        End If

        If oldPoint.X <> newPoint.X And newPoint.Y <> oldPoint.Y Then
            If Me.grdSchnellLand.Item(newPoint.Y, 0).ToString = System.String.Empty Or Me.grdSchnellLand.Item(newPoint.Y, 1).ToString = System.String.Empty Or Me.grdSchnellLand.Item(newPoint.Y, 2).ToString = System.String.Empty Then
                Call makeNewLine(newPoint)
            End If
            Exit Sub
        End If
    End Sub

Die benötigten Form-weiten Variablen sind folgende:

Code:
Dim myDTl As System.Data.DataTable  ‘eine DataTable, welche die Daten beinhaltet
Dim newPoint, oldPoint As System.Drawing.Point    ‘diese beiden Punkte speichern die aktuelle Cursor-Position im DataGrid

Das Einfügen der ComboBox in das DataGrid funktioniert über einen TableStyle folgendermaßen:

Code:
Dim ts As System.Windows.Forms.DataGridTableStyle
ts = New System.Windows.Forms.DataGridTableStyle
ts.MappingName = "Table"
Dim tcLand As New DataGridComboBoxColumn
With tcLand                         ‘diese Daten müssen angepasst werden
    .MappingName = "Land"           ‘der MappingName ist der Name der Spalte, wie sie in der Datenbank angelegt wurde
    .HeaderText = "Land"            ‘HeaderText ist der Wert, der im DataGrid im Spaltenkopf angezeigt wird
    .NullText = ""                  ‘NullText ist der Wert, der angezeigt wird, wenn die Zelle leer ist
    .Width = 175                    ‘Width ist die Spaltenbreite
End With
ts.GridColumnStyles.Add(tcLand)
Me.grdSchnellLand.TableStyles.Add(ts)

So, ich hoffe das war nicht zu viel...?! ;) Die Datei mit der ComboBox-Klasse wurde von mir angehängt.

MfG
..::Six Dark::..
 

Anhänge

  • combobox_in_datagrid.zip
    1,2 KB · Aufrufe: 56

Neue Beiträge

Zurück