2016-12-21 14 views
1

CSVファイルからデータを取得し、DataTableで解析してから、このDataTableをDataGridのItemsSourceとして設定しています。次に、DataTableをループしてデータの検証を行い、それに応じてDataGridの行を色付けする必要があります。DataTable値に基づいてDataGrid行の色を設定します。

問題は、DataTable行に基づいて対応するDataGrid行が見つかりません。

Dim dg As New DataGrid 
Dim dataTable as DataTable = ParseFile(filePath) 
Dim statutList() As String = {"Saisi", "Validé", "Suspendu", "Annulé"} 

dg.ItemsSource = dataTable.DefaultView 

For Each row As DataRow In dataTable.Rows 
    'This line is what I tried, but it always returns nothing 
    Dim dgrow As DataGridRow = dg.ItemContainerGenerator.ContainerFromItem(row) 
    If Not statutList.Contains(row("Statut").ToString) Then 
     dgrow.Background = Brushes.Red 
    End If 
Next 

問題は動作しません、このライン、から来ている:

Dim dgrow As DataGridRow = dg.ItemContainerGenerator.ContainerFromItem(row) 

SOLUTION:

両方MM8ソリューションの作業

は、ここに私のコードです。私の場合、私が使用:

dg.UpdateLayout() 
For Each row As DataRowView In dg.Items.OfType(Of DataRowView) 
    Dim dgrow As DataGridRow = dg.ItemContainerGenerator.ContainerFromItem(row) 
    If Not statutList.Contains(row("Statut").ToString) Then 
     dgrow.Background = Brushes.Red 
    End If 
Next 

答えて

1

これを行うには正しい「WPF」の方法は、その「Statut」列の行の背景色を設定する1つの以上のデータのトリガーとRowStyleを定義するだろう特定の行には、例えば、任意の特定の値(複数可)を返します。

<DataGrid x:Name="dg"> 
    <DataGrid.Resources> 
     <SolidColorBrush x:Key="color" Color="Red" /> 
    </DataGrid.Resources> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Statut}" Value="Saisi"> 
        <Setter Property="Background" Value="{StaticResource color}" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Statut}" Value="Validé"> 
        <Setter Property="Background" Value="{StaticResource color}" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Statut}" Value="Suspendu"> 
        <Setter Property="Background" Value="{StaticResource color}" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding Statut}" Value="Annulé"> 
        <Setter Property="Background" Value="{StaticResource color}" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 

あなたの現在のコードビハインドアプローチでしょう大丈夫仕事をあなたは少しそれを変更した場合:

For Each row As DataRowView In dg.Items.OfType(Of DataRowView) 
     Dim dgrow As DataGridRow = dg.ItemContainerGenerator.ContainerFromItem(row) 
     If Not statutList.Contains(row("Statut").ToString) Then 
      dgrow.Background = Brushes.Red 
     End If 
    Next 

注意をItemContainことerGenerator.ContainerFromItem方法は、実際のDataTableには、多数の行が含まれており、無効にUIの仮想化を持っていない場合はすぐに仮想化されている可能性の項目についてDataGridRowコンテナを返しません。

<DataGrid x:Name="dg" VirtualizingPanel.IsVirtualizing="False">. 

は明らかにつながる可能性が仮想化を無効にしますDataTableに多数の行が含まれている場合は、パフォーマンスの問題が発生します。

また、コンテナが実際に作成された後で、たとえばウィンドウのLoadedイベントが発生したときにコードを実行する必要があることにも注意してください。

Class MainWindow 
    Dim statutList() As String = {"Saisi", "Validé", "Suspendu", "Annulé"} 

    Public Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     Dim dg As New DataGrid 
     Dim dataTable As DataTable = ParseFile(filePath) 

     dg.ItemsSource = dataTable.DefaultView 
    End Sub 

    Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded 
     For Each row As DataRowView In dg.Items.OfType(Of DataRowView) 
      Dim dgrow As DataGridRow = dg.ItemContainerGenerator.ContainerFromItem(row) 
      If Not statutList.Contains(row("Statut").ToString) Then 
       dgrow.Background = Brushes.Red 
      End If 
     Next 
    End Sub 
    ... 
End Class 
+0

私はwpfアプローチを使用したいと思いますが、これはデータ検査コードと同じくらい小さな部分です。いくつかの細胞をいくつかの他の値(+200)と照合しなければならない。あなたのコードビハインドアプローチコードは残念なことには機能しません。 – Naucle

+1

「うまくいかない」とは正確に何を意味するのですか?あなたは例外を取得していますか?コンテナが実際に作成されると、たとえばウィンドウのLoadedイベントが発生したときなどに、このコードを実行する必要があります。ウィンドウのコンストラクタ内のコンテナを反復処理することはできません。 – mm8

+0

dgrowでNullReferenceExceptionが発生します。 DataGridは実際にチェック部分の前にロードされます(For Eachループはコンテナにデータを書き込むdg.ItemsSource = dataTable.DefaultViewの後にあります)。 – Naucle

関連する問題