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::..