我有一些代码循环遍历两个Datagrids(dgFiles1和dgFiles2,每一列),并检查每个数据网格中的非常见项目。如果一个项目不在另一个项目中,则应突出显示红色的行。
private void dgFiles_LoadingRow(object sender, DataGridRowEventArgs e)
{
var itemsSource1 = dgFiles1.ItemsSource as IEnumerable;
var itemsSource2 = dgFiles2.ItemsSource as IEnumerable;
if (itemsSource1 != null && itemsSource2 != null)
{
foreach (var item1 in itemsSource1)
{
bool exists = false;
foreach (var item2 in itemsSource2)
{
if (item1.ToString() == item2.ToString())
{
colorWhite(dgFiles2, e);
exists = true;
}
}
if (!exists)
{
colorRed(dgFiles1, e);
}
exists = false;
}
foreach (var item1 in itemsSource2)
{
bool exists = false;
foreach (var item2 in itemsSource1)
{
if (item1.ToString() == item2.ToString())
{
colorWhite(dgFiles1, e);
exists = true;
}
}
if (!exists)
{
colorRed(dgFiles2, e);
}
exists = false;
}
}
}
private void colorWhite(object sender, DataGridRowEventArgs e)
{
e.Row.Background = Brushes.White;
}
private void colorRed(object sender, DataGridRowEventArgs e)
{
e.Row.Background = Brushes.Red;
}
dgFiles_LoadingRow附加到两个datagrids LoadingRows事件。我的问题是colorWhite和colorRed函数只会调用调用数据网格的行,而不会调整其他数据网格的颜色。所以说例如通过将一些行加载到dgFiles1中来触发事件,它只会在dgFiles1中为非常见项目着色,而在dgFiles2中永远不会,即使它也有非常见文件。我知道逻辑工作正常,它只是为其他数据网格的行着色的命令。
我认为通过将发送方传递给colorRed或colorWhite,它会为datagrids行着色,但它只会调用datagrid。
答案 0 :(得分:1)
我认为通过将发送者传递给colorRed或colorWhite,它会为datagrids行着色......
然后你想错了。 DataGridRowEventArgs
引用在整个方法中是相同的。如果为dgFiles1
中的行引发了事件,则只能引用此特定行。
您应该能够使用ContainerFromItem
方法获取项目的相应容器,例如:
foreach (var item2 in itemsSource2)
{
if (item1.ToString() == item2.ToString())
{
var row = dgFiles2.ItemContainerGenerator.ContainerFromItem(item2) as DataGridRow;
if(row != null)
row.Background = Brushes.White;
exists = true;
}
}