Hallo,<br>
<br>
ich habe bei einer VB.NET-Applikation (PocketPC2003 + Compact Framework + SQL 2.0) folgendes Problem:<BR>
Über ein SQL-Statement hole ich mir Daten aus der lokalen DB und zeige diese in einem DataGrid an:
<pre>
Private daDataAdapter As SqlCeDataAdapter
Private dsDataSet As DataSet
Private dvDataView As DataView
...
' Daten holen
daDataAdapter = New SqlCeDataAdapter("select feld1, feld2 from mytable", dbconMain)
dsDataSet = New DataSet
daDataAdapter.Fill(dsDataSet)
' dgDataGrid ist DataGrid in der Form
dgDataGrid.DataSource = dsDataSet.Tables(0)
' Spalten definieren
dgDataGrid.TableStyles.Clear()
Dim aDGTS As New DataGridTableStyle
Dim aDGTBC As DataGridTextBoxColumn
aDGTBC = New DataGridTextBoxColumn
aDGTBC.MappingName = "feld1"
aDGTBC.HeaderText = "Feld 1"
aDGTBC.Width = 50
aDGTS.GridColumnStyles.Add(aDGTBC)
aDGTBC = New DataGridTextBoxColumn
aDGTBC.MappingName = "feld2"
aDGTBC.HeaderText = "Feld 2"
aDGTBC.Width = 50
aDGTS.GridColumnStyles.Add(aDGTBC)
aDGTS.MappingName = dsDataSet.Tables(0).TableName
dvDataView = New DataView(dsDataSet.Tables(0))
' sortieren
dsDataSet.Tables(0).DefaultView.Sort = "feld1"
</pre>
<br>
Das funktioniert auch alles so, wie es soll.<br>
<br>
Über OnClick-Events schalte ich beim Anklicken der Spalten-Überschriften die Sortierung entsprechend um:
<pre>
Public Sub Handler_DataGrid_MouseUp_Test(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim hitTest As DataGrid.HitTestInfo
Dim dataTable As DataTable
Dim dataView As DataView
Dim columnName As String
Dim dataGrid As DataGrid
If e.Button = MouseButtons.Left AndAlso _
(boolButtonPressHeader Or boolButtonPressDetail) Then
dataGrid = CType(sender, DataGrid)
hitTest = dataGrid.HitTest(e.X, e.Y)
If hitTest.Type = dataGrid.HitTestType.ColumnHeader AndAlso boolButtonPressHeader Then
dataTable = CType(dataGrid.DataSource, DataTable)
dataView = dataTable.DefaultView
columnName = dataTable.Columns(hitTest.Column).ColumnName
If dataView.Sort = columnName Then
dataView.Sort = columnName + " DESC"
Else
dataView.Sort = columnName
End If
End If
boolButtonPressHeader = False
boolButtonPressDetail = False
End If
End Sub
</pre>
<br>
Das Problem ist nun, dass der Row-Index des DataGrids nicht der Row-Index der DataTable ist, da nur DataGrid sortiert wird und nicht auch DataTable. D.h., mit einem
<pre>
dataGrid.DataSource = Nothing
dataTable.Rows.RemoveAt(dataGrid.CurrentCell.RowNu mber)
dataGrid.DataSource = dataTable
</pre>
würde dann auch der falsche Datensatz aus dataTable entfernt.<br>
<br>
Wie kann ich über die aktuelle Zeile (CurrentCell.RowNumber) eines DataGrids den Index der dazugehörigen Row von dataTable ermitteln?<br>
<br>
Danke für jeden Hinweis!<br>
<br>
Gruß, Ulrich
<br>
ich habe bei einer VB.NET-Applikation (PocketPC2003 + Compact Framework + SQL 2.0) folgendes Problem:<BR>
Über ein SQL-Statement hole ich mir Daten aus der lokalen DB und zeige diese in einem DataGrid an:
<pre>
Private daDataAdapter As SqlCeDataAdapter
Private dsDataSet As DataSet
Private dvDataView As DataView
...
' Daten holen
daDataAdapter = New SqlCeDataAdapter("select feld1, feld2 from mytable", dbconMain)
dsDataSet = New DataSet
daDataAdapter.Fill(dsDataSet)
' dgDataGrid ist DataGrid in der Form
dgDataGrid.DataSource = dsDataSet.Tables(0)
' Spalten definieren
dgDataGrid.TableStyles.Clear()
Dim aDGTS As New DataGridTableStyle
Dim aDGTBC As DataGridTextBoxColumn
aDGTBC = New DataGridTextBoxColumn
aDGTBC.MappingName = "feld1"
aDGTBC.HeaderText = "Feld 1"
aDGTBC.Width = 50
aDGTS.GridColumnStyles.Add(aDGTBC)
aDGTBC = New DataGridTextBoxColumn
aDGTBC.MappingName = "feld2"
aDGTBC.HeaderText = "Feld 2"
aDGTBC.Width = 50
aDGTS.GridColumnStyles.Add(aDGTBC)
aDGTS.MappingName = dsDataSet.Tables(0).TableName
dvDataView = New DataView(dsDataSet.Tables(0))
' sortieren
dsDataSet.Tables(0).DefaultView.Sort = "feld1"
</pre>
<br>
Das funktioniert auch alles so, wie es soll.<br>
<br>
Über OnClick-Events schalte ich beim Anklicken der Spalten-Überschriften die Sortierung entsprechend um:
<pre>
Public Sub Handler_DataGrid_MouseUp_Test(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
Dim hitTest As DataGrid.HitTestInfo
Dim dataTable As DataTable
Dim dataView As DataView
Dim columnName As String
Dim dataGrid As DataGrid
If e.Button = MouseButtons.Left AndAlso _
(boolButtonPressHeader Or boolButtonPressDetail) Then
dataGrid = CType(sender, DataGrid)
hitTest = dataGrid.HitTest(e.X, e.Y)
If hitTest.Type = dataGrid.HitTestType.ColumnHeader AndAlso boolButtonPressHeader Then
dataTable = CType(dataGrid.DataSource, DataTable)
dataView = dataTable.DefaultView
columnName = dataTable.Columns(hitTest.Column).ColumnName
If dataView.Sort = columnName Then
dataView.Sort = columnName + " DESC"
Else
dataView.Sort = columnName
End If
End If
boolButtonPressHeader = False
boolButtonPressDetail = False
End If
End Sub
</pre>
<br>
Das Problem ist nun, dass der Row-Index des DataGrids nicht der Row-Index der DataTable ist, da nur DataGrid sortiert wird und nicht auch DataTable. D.h., mit einem
<pre>
dataGrid.DataSource = Nothing
dataTable.Rows.RemoveAt(dataGrid.CurrentCell.RowNu mber)
dataGrid.DataSource = dataTable
</pre>
würde dann auch der falsche Datensatz aus dataTable entfernt.<br>
<br>
Wie kann ich über die aktuelle Zeile (CurrentCell.RowNumber) eines DataGrids den Index der dazugehörigen Row von dataTable ermitteln?<br>
<br>
Danke für jeden Hinweis!<br>
<br>
Gruß, Ulrich
Comment