2017-06-20 46 views
0

Intsという2つの縦書きの列に並べる必要がある2つのリストがあります。数字が一致しない場合は、これを強調する必要があります(一方または両方のセル、背景やフォントの色を変更することは問題ではありません)。プログラムでセルの色を変更する

私が最初にサイドListBoxesによって側でこれらを表示しましたが、私はそれが難しいプログラムで特定のセルの色を変更することがわかったとき、私はDataGridを見て始めたが、これはあまりにも難しい+私がオンラインに表示されたガイドの多くの証明WPFではなく、Windowsフォームに焦点を当ててください。

私は単純な作業で何が推奨されたコントロールになると思っていましたか、これらの異なるセル/インデックスを識別し、その外観を更新する方法を教えてください。

余分な情報:両方のリストはひどく長い(< 15)はありません。

私はデータグリッドを使用していたときにこれを試しました。

答えて

1

データグリッド/リストボックスのようなスタイルを設定することができますがItemsControlsであり、単一のコレクションに適しています。 list1とlist2のアイテムのペアを持つオブジェクトの追加リストを作成して、異なるアイテムを示す属性を作成し、そのリストをUIに表示することをお勧めします。

var L1 = new List<int> {1, 2, 3, 4, 5}; 
var L2 = new List<int> {1, 2, 0, 4, 5}; 
var results = L1.Zip(L2, (i, j) => new {Previous = i, Current = j, IsDifferent = i != j}); 
ListResults.ItemsSource = results; 
<ItemsControl Name="ListResults"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <UniformGrid Rows="1"> 
       <UniformGrid.Style> 
        <Style TargetType="UniformGrid"> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=IsDifferent}" Value="true"> 
          <Setter Property="Background" Value="Crimson"/> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </UniformGrid.Style> 
       <Label Content="{Binding Path=Previous}"/> 
       <Label Content="{Binding Path=Current}"/> 
      </UniformGrid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

diff


データテーブル/データグリッドを有する代替

var L1 = new List<int> {1, 2, 3, 4, 5}; 
var L2 = new List<int> {1, 2, 0, 4, 5}; 

var dt = new DataTable 
      { 
       Columns = 
       { 
        {"Previous", typeof (int)}, 
        {"Current", typeof (int)}, 
        {"IsDifferent", typeof (bool)}, 
       } 
      }; 
for (int x = 0; x < L1.Count; x++) 
    dt.Rows.Add(L1[x], L2[x], L1[x] != L2[x]); 

DgResults.ItemsSource = dt.DefaultView; 
<DataGrid Name="DgResults" AutoGenerateColumns="False" ColumnWidth="*" IsReadOnly="True"> 
    <DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=IsDifferent}" Value="true"> 
        <Setter Property="Background" Value="Crimson"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 

    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Previous}"/> 
     <DataGridTextColumn Binding="{Binding Path=Current}"/> 
    </DataGrid.Columns> 
</DataGrid> 

属性IsDifferentは、背景を変更するためにDataTriggerで使用されます

+0

すごく簡単です!以前の列、現在の列、IsDifferent列のDataTableを使用するように 'ItemSource'行を変更する方法はありますか? – windowskm

+0

@windowskm、yes: 'ListResults.ItemsSource = myDataTable.DefaultView;' – ASh

0

あなたのapp.xamlでは、一致しない行に使用するスタイルを作成します。

<Style TargetType="DataGridRow"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

あなたが行を列挙し、一致しないものを見つけた場合は、この

Style style = Application.Current.FindResource("DataGridRow") as Style; 
row.Style = style; 
関連する問題