Announcement

Collapse
No announcement yet.

Im DataGrid Datensatz selektieren - nicht index

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

  • Im DataGrid Datensatz selektieren - nicht index

    Hallo
    ich habe ein Datagrid (Read Only)
    zum binden benutze ich den CurrencyManager

    ich möchte das der aktuelle datensatz immer sektiert ist

    leider funktioniert es nicht mehr sobald ich die DataGridColumn
    sortiere

    ich habe schon alles versucht
    DataGrid1_Click
    DataGrid1_MouseUp usw
    auch mit DataGrid.HitTestInfo

    leider kein erfolg

    ich möchte das der zeiger mit den letzten selektiert datensatz immer mitwandert
    und nicht auf den rowindex bleibt wenn ich auf sortieren drücken

    weiß jemand einen weisen rat?

    Raimund

  • #2
    Hallo,
    wenn das .NET Framework 2.0 genutzt werden kann (VS2005), ist diese Aufgabe leicht umsetzbar. Das DataGridView-Control (der Nachfolger vom DataGrid) wird an die BindingSource-Komponente gehängt, die zwischen dem Control und dem typisierten DataSet liegt und den CurrencyManager als nichtvisuelle Komponente kapselt. Das DataGridView-Control löst immer dann das Ereignis <b>Sorted</b> aus, wenn die Sortierreihenfolge über den Mausklick auf die Spaltenüberschrift geändert wurde. In der Ereignisbehandlungsmethode für das Sorted-Ereignis kann dann der virtuelle Datensatzzeiger über die BindingSource-Eigenschaft <b>Position</b> auf den DataView-Indexwert gesetzt werden, der sich über die <b>Find</b>-Methode der BindingSource-Komponente für die aktuell geltende Sortierung ergibt (es wird dabei immer nach der Primärschlüsselspalte der Tabelle gesucht, nicht nach der sortierten Spalte). Der "alte" Vergleichwert wird in der Ereignisbehandlungsmethode für das <b>PositionChanged</b>-Ereignis der BindingSource-Komponente in einer Member-Variablen gesichert:
    <pre>
    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">private</span> <span style="color: blue;">int</span> iLastID; </p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">/*</span></p><p style="margin: 0px;"><span style="color: green;">&nbsp; Das Ereignis Sorted wird nur dann ausgelöst, wenn das DataGridView die </span></p><p style="margin: 0px;"><span style="color: green;">&nbsp; Sortierung geändert hat (Bsp: Mausklick auf die Spaltenüberschrift).</span></p><p style="margin: 0px;"><span style="color: green;">*/</span></p><p style="margin: 0px;"><span style="color: blue;">private</span> <span style="color: blue;">void</span> testTblDataGridView_Sorted(<span style="color: blue;">object</span> sender, <span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; testTblBindingSource.Position = testTblBindingSource.Find(<span style="color: maroon;">"id"</span>, iLastID);</p><p style="margin: 0px;">}</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: green;">/*</span></p><p style="margin: 0px;"><span style="color: green;">&nbsp;&nbsp;&nbsp; Das Ereignis PositionChanged wird nur dann ausgelöst, wenn der virtuelle </span></p><p style="margin: 0px;"><span style="color: green;">&nbsp;&nbsp;&nbsp; Datensatzzeiger entweder über den RowHeader des DataGridView oder über </span></p><p style="margin: 0px;"><span style="color: green;">&nbsp;&nbsp;&nbsp; den Navigator geändert wird. Die Ereignisbehandlungsmethode speichert </span></p><p style="margin: 0px;"><span style="color: green;">&nbsp;&nbsp;&nbsp; den Primärschlüsselwert des zuletzt ausgewählten Datensatzes.</span></p><p style="margin: 0px;"><span style="color: green;">*/</span></p><p style="margin: 0px;"><span style="color: blue;">private</span> <span style="color: blue;">void</span> testTblBindingSource_PositionChanged(<span style="color: blue;">object</span> sender, <span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: teal;">DataRowView</span> aDRV = testTblBindingSource.Current <span style="color: blue;">as</span> <span style="color: teal;">DataRowView</span>;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; iLastID = (<span style="color: blue;">int</span>)aDRV.Row[0];</p><p style="margin: 0px;">}</p></div>
    </pre>
    Im Ergebnis zeigt das DataGridView immer den vor der Sortier-Änderung
    aktuellen Datensatz als ausgewählten Datensatz an.
    <br>
    Da Delphi 2005 nur auf das .NET Framework 1.1 zurückgreifen kann, stehen weder DataGridView noch BindingSource zur Verfügung. Man muss daher zum einen direkt mit dem CurrencyManager hantieren und sich zudem von Hand auch ein Gegenstück für das Sorted-Ereignis bauen

    Comment


    • #3
      Hallo Herr Kosch
      ihre Lösung finde ich sehr gut
      nur wir sind hier
      in Entwickler Forum / .NET / Delphi .NET /

      ich betone hier nur das wort delphi ;-)

      damit wäre das DataGridView-Control hinfällig
      bzw Framework 2.0

      mein Problem ist :
      ich bekomme es nicht mit, auf welchen teil des Datagrids geklickt wurde, header, row oder cell

      Raimund

      PS
      bevor delphi 2.0 fähig ist, gibt es schon 10.0
      und so lange wollte ich nicht warte

      Comment


      • #4
        Hallo,
        seit Delphi 8 kann Delphi auch C# verdauen, somit war die Sprache für das Beispiel schon einmal richtig :-)
        <br>
        &gt;...mein Problem ist :...
        Für das .NET Framework 1.x gibt es an dieser Stelle nur 2 Alternativen: <br>
        1. Alternativ-Komponente zum DataGrid beschaffen, die das gewünschte Ereignis auslöst <br>
        2. Eigenen Nachfolger der DataGrid-Klasse entwickeln, um an das benötigte Ereignis zu kommen

        Comment


        • #5
          Ich habe versucht, die beschriebene Methode anzuwenden. Leider funktioniert es noch nicht. Kann mir jemand einen Tipp geben?

          Code:
              Private iLastID As Integer
          
              Private Sub DataGridView_Sorted(ByVal sender As Object, ByVal e As EventArgs)
                  BindingSource1.Position = BindingSource1.Find("ID", iLastID)
              End Sub
          
              Private Sub BindingSource_PositionChanged(ByVal sender As Object, ByVal e As EventArgs)
                  Dim aDRV As DataRowView = TryCast(BindingSource1.Current, DataRowView)
                  iLastID = CInt(aDRV.Row(0))
              End Sub
          
              Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
          
                  Dim DaSe As New System.Data.DataSet
                  Dim DaTa As DataTable
          
                  Dim cmd As New SqlClient.SqlCommand
                  cmd.Connection = Con
                  cmd.CommandText = "SELECT ID, Vorname, Nachname FROM Personen"
          
                  Dim Ada As System.Data.SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(cmd)
                  Ada.Fill(DaSe, "Tab")
                  DaTa = DaSe.Tables("Tab")
          
                  BindingSource1.DataSource = DaTa
                  DataGridView1.DataSource = BindingSource1
          
              End Sub

          Comment

          Working...
          X