Announcement

Collapse
No announcement yet.

Datagridview sortieren

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

  • Datagridview sortieren

    Tag zusammen,

    da meine datensätze relativ viel sind verzichte ich auf DataTable und möchte
    dennoch sortieren filtern etc.

    wenn ich auf ein DatagridviewColumn clicke fange ich dies ab un erhalte z.B.
    die VALUE "Datum" welche wiederrum in der Classe eben "Datum" heisst.

    wie kann ich nun einen bezug herstellen?

    Code:
    ' im click-ereigniss
    
    Dim txt As String = DataGridView1.Columns(e.ColumnIndex).Name
    ' txt = "Datum" als Beispiel
    zum sortieren etc.
    Code:
    myData.Daten.OrderBy(Function(x) x.Datum) ' klappt ja
    ' nur wie bekomme ich dort den STRING rein !?

    mit delegate oder so ?
    danke für nen tipp
    Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
    Um heute vorm PC zu sitzen!

  • #2
    Per Reflection läßt sich der Zugriff auf eine Property erreichen, die nur vom Namen her bekannt ist, nachstehend mit einer kleinen Hilfsklasse (OrderByHelper) realisiert.

    [highlight=vbnet]
    Dim helper As New OrderByHelper(item.GetType(), "MyProp1")
    myData.Daten.OrderBy(Function(x) helper.GetKey(x))


    Public Class OrderByHelper
    Private _pi As System.Reflection.PropertyInfo
    Public Sub New(type As System.Type, ByVal propertyName As String)
    _pi = GetPropertyInfo(type, propertyName)
    End Sub

    Private Function GetPropertyInfo(type As Type, propertyName As String) As System.Reflection.PropertyInfo
    Return (From pi As System.Reflection.PropertyInfo In type.GetProperties
    Where String.Compare(pi.Name, propertyName, True) = 0 AndAlso pi.GetIndexParameters.Length = 0
    Select pi).First
    End Function

    Public Function GetKey(ByVal obj As Object) As Object
    Return _pi.GetValue(obj, New Object() {})
    End Function
    End Class[/highlight]

    Comment


    • #3
      super danke - klappt wirklich gut und schnell.

      [highlight=vbnet]
      Friend colSort() As Boolean
      Private Sub dgv1_ColumnHeaderMouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArg s) Handles dgv1.ColumnHeaderMouseClick

      Dim stw As New Stopwatch

      stw.Start()
      Dim ItemString As String = dgv1.Columns(e.ColumnIndex).Name
      Dim item As New StockSumCon
      Dim helper As New OrderByHelper(item.GetType, ItemString)

      If colSort(e.ColumnIndex) Then
      myStocks.Stocks.OrderByDescending(Function(x) helper.GetKey(x))
      bDGV1Source.DataSource = myStocks.Stocks
      colSort(e.ColumnIndex) = False
      Else
      myStocks.Stocks.OrderBy(Function(x) helper.GetKey(x))
      bDGV1Source.DataSource = myStocks.Stocks
      colSort(e.ColumnIndex) = True
      End If

      dgv1.DataSource = bDGV1Source.DataSource
      stw.Stop()
      Console.WriteLine("Sort: " & stw.ElapsedMilliseconds)

      [/highlight]
      hab nur heute wenig zeit . muss noch den "Bindingsource" und so
      ändern.

      vielen dank und mfg
      ritsch aus münchen
      = Nachtrag:

      Mit DataTable, welche größer als z.B. 100.000 DTsätze sind
      ist es doch ein grauen, a) zu sortieren b) zu filtern etc.

      1) die umwandlung zum DT dauert schon mal bis zu 7 oder mehr sekunden
      (sofern es nicht schon als DT vorliegt)
      2) sortieren dauert dann stets gleich lang - logisch, aber:
      3) wenn man nen Filter macht, welcher eigentlich ja ganz gut und simpl zu machen wäre,
      dann z.b. auf nur noch 10 DATENSÄTZE runterfiltert und mal auf sortieren drückt *lol
      da merkt man dann, dass die sortierung immer noch auf die 100.000 Datzensätze
      zugreift. äusserst intelegent (einen tadel diesbezüglich an mich wäre auch ok)

      na ja ... mir gefällts jetzt mit sortieren/filtern (mit ner art tempClasse) supergut *jubel*

      danke nochmal an akk
      Zuletzt editiert von Fremder; 09.10.2010, 21:53. Reason: funktioniert super
      Vor 4,5 Millionen Jahren lernten ~wir~ aufrecht zu gehen!
      Um heute vorm PC zu sitzen!

      Comment

      Working...
      X