WPF Datagrid Indexproblem

  • WPF

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von mpmichael.

    WPF Datagrid Indexproblem

    Hallo,

    ich habe ein Problem mit einem Datagrid. Ich baue das Grid aus einer eigenen Klasse auf. Wenn eine Zeile markiert wird und über ein ContextMenu der Punkt Computer Info gewählt wird, dann wird der Datensatz an das Fenster übergeben. Geht auch - solang bis ich die Tabelle (Grid) anders sortiere. Dann stimmt der Index nicht mehr. Lässt sich die Indexierung nach einem Sort neu erstellen?

    Hier der Code:

    Das Grid

    XML-Quellcode

    1. <Grid Background="#FFE5E5E5">
    2. <DataGrid x:Name="DG_Clients" ItemsSource="{Binding}" SelectedItem="{Binding ClientName}" HorizontalAlignment="Left" Height="496" Margin="10,41,0,0" VerticalAlignment="Top" Width="1497" AlternatingRowBackground="LightBlue" AlternationCount="2" FontFamily="Consolas" FontSize="11" HorizontalGridLinesBrush="#FFE4DDDD" VerticalGridLinesBrush="#FFE4DDDD" IsReadOnly="True" AutoGenerateColumns="False">
    3. <DataGrid.Columns>
    4. <DataGridCheckBoxColumn Binding="{Binding IsActive}" ClipboardContentBinding="{x:Null}" Header="Activ"/>
    5. <DataGridTextColumn Binding="{Binding ClientName}" ClipboardContentBinding="{x:Null}" Header="Client Name"/>
    6. <DataGridTextColumn Binding="{Binding Description}" ClipboardContentBinding="{x:Null}" Header="Beschreibung"/>
    7. <DataGridTextColumn Binding="{Binding Seriennummer}" ClipboardContentBinding="{x:Null}" Header="Serien Nummer"/>
    8. <DataGridTextColumn Binding="{Binding LastLogon}" ClipboardContentBinding="{x:Null}" Header="Last seen"/>
    9. <DataGridTextColumn Binding="{Binding Created}" ClipboardContentBinding="{x:Null}" Header="Erzeugt"/>
    10. <DataGridTextColumn Binding="{Binding Betriebssystem}" ClipboardContentBinding="{x:Null}" Header="Betriebssystem"/>
    11. <DataGridTextColumn Binding="{Binding OSVersion}" ClipboardContentBinding="{x:Null}" Header="OSVersion"/>
    12. <DataGridTextColumn Binding="{Binding Container}" ClipboardContentBinding="{x:Null}" Header="Container"/>
    13. <DataGridCheckBoxColumn Binding="{Binding UACSet.UAC_WorkstTrustAcc}" ClipboardContentBinding="{x:Null}" Header="Workstation"/>
    14. <DataGridTextColumn Binding="{Binding ObjectSid}" ClipboardContentBinding="{x:Null}" Header="SID"/>
    15. </DataGrid.Columns>
    16. <DataGrid.ContextMenu>
    17. <ContextMenu>
    18. <MenuItem Header="Computer Info" Click="MRowComupterInfo_Click"/>
    19. <MenuItem Header="Aktivieren / Deaktivieren" Click="MDeOrActivateComputer"/>
    20. </ContextMenu>
    21. </DataGrid.ContextMenu>
    22. </DataGrid>
    23. <Button x:Name="BT_RefeschCPM" Content="" Click="LoadClients" HorizontalAlignment="Left" Margin="10,4,0,0" VerticalAlignment="Top" Width="32" Height="32" ToolTip="Refresh der Client Liste" BorderBrush="{x:Null}" Foreground="{x:Null}">
    24. <Button.Effect>
    25. <DropShadowEffect/>
    26. </Button.Effect>
    27. <Button.Background>
    28. <ImageBrush ImageSource="view-refresh.png"/>
    29. </Button.Background>
    30. </Button>
    31. </Grid>


    Die Klasse(n):

    VB.NET-Quellcode

    1. Public Class ClientObject
    2. Public Property IsActive As Boolean
    3. Public Property ClientName As String
    4. Public Property Seriennummer As String
    5. Public Property Description As String
    6. Public Property Betriebssystem As String
    7. Public Property OSVersion As String
    8. Public Property LastLogon As String
    9. Public Property Container As String
    10. Public Property Created As String
    11. Public Property DistinguishedName As String
    12. Public Property SamAccountName As String
    13. Public Property UACVal As Integer
    14. Public Property ObjectSid As String
    15. Public Property UACSet As UAControl
    16. Public Property WMIData As New WMINetFunx.WMIData
    17. Public Property Network As New WMINetFunx.Network
    18. End Class
    19. Public Class ClientObjectList
    20. Private VClientList As New List(Of ClientObject)
    21. Public Property ClientList As List(Of ClientObject)
    22. Get
    23. Return VClientList
    24. End Get
    25. Set(value As List(Of ClientObject))
    26. End Set
    27. End Property
    28. End Class


    Der Code

    VB.NET-Quellcode

    1. Class MainWindow
    2. Public Shared TheClients As New LDAPFunx.ClientObjectList
    3. ...
    4. ...
    5. DG_Clients.DataContext = TheClients.ClientList
    6. Private Sub MRowComupterInfo_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    7. Dim WDClientInfo As New WDComupterInfo With {
    8. .Workstation = TheClients.ClientList(DG_Clients.SelectedIndex)
    9. }
    10. WDClientInfo.MyDBLog = MyDBLog
    11. WDClientInfo.Show()
    12. End Sub
    13. End Class



    Ich müsste wohl irgendwo so etwas wir ein RowIndexChanged einbauen - aber das gibt es so nicht und dann wäre die Frage wie ich die Reindizierung der eigentlichen Datenbasis (also TheClients) bekomme, damit ich das richtige Objekt erwische.
    Hallo,

    na ja du hast ja die SelectedItem Eigenschaft von dem DataGrid bereits gebunden (an ein Property, das ClientName heißt). Jetzt kannst du doch einfach das aktuell selektierte Element übergeben, anstatt den Umweg über den RowIndex zu gehen?

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    Hallo,

    danke - ja das war auch meine Idee. Aber mir gelingt es nicht die Eigenschaft zu adressieren.
    DG_Client.selecteditem ist immer gleich das ganze Objekt.
    Oder meintest Du das ganze Objekt gleich übernehmen...
    Wenn ich das doch richtig sehe, weißt du doch in Zeile 8 im Programm das Workstation-Property von WDClientInfo ein "ClientObject" zu, welches du mit hilfe der ID aus einer Liste abrufst. Du kannst doch - anstatt in der Liste mit der ID rumzusuchen einfach direkt das SelectedItem übergeben.
    ----

    WebApps mit C#: Blazor
    Hallo,

    danke für den Denkanstoß. Ich habe es jetzt so gemacht:

    VB.NET-Quellcode

    1. Private Sub MRowComupterInfo_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    2. Dim RowSelected As IList = DG_Clients.SelectedItems
    3. Dim WDClientInfo As New WDComupterInfo With {
    4. .Workstation = CType(RowSelected(0), LDAPFunx.ClientObject) 'TheClients.ClientList(DG_Clients.SelectedIndex)
    5. }
    6. WDClientInfo.MyDBLog = MyDBLog
    7. WDClientInfo.Show()
    8. End Sub