Announcement

Collapse
No announcement yet.

DataGrid + DataTable: Rowindex ermitteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataGrid + DataTable: Rowindex ermitteln

    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

  • #2
    Hallo,

    damit dieses Problem nicht auftritt, muss der für das DataGrid zuständige <b>CurrencyManager</b> ausgewertet werden. Als Alternative zum direkten Löschen in der DataTable steht auch die Methode <b>RemoveAt</b> des CurrencyManagers zur Verfügung. Auch in diesem Fall sorgt ein späterer Update-Aufruf des DataAdapters dafür, dass eine DELETE-Anweisung für diesen Datensatz zur SQL-Datenbank geschickt wird.

    <pre>
    Dim aCM As CurrencyManager
    <br>
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
    SqlDataAdapter1.Fill(DataSet11, DataSet11.Customers.TableName)
    aCM = CType(Me.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember), CurrencyManager)
    End Sub
    <br>
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    aCM.RemoveAt(aCM.Position)
    End Sub
    </pre&gt

    Comment


    • #3
      Hallo und besten Dank!<br>
      <br>
      "CurrencyManager" war genau das Bindeglied, das mir fehlte. Jetzt kann ich auch mit "intID =CInt(CType(cmCurrencyManager.Current, DataRowView).Row.Item(iColIndex))" auf Werte von Feldern zugreifen, die nicht im Grid angezeigt werden.<br>
      <br>
      Gruß, Ulric

      Comment

      Working...
      X