DevExpress Winform -如何在多个关键字段的两个网格控件之间比较数据

本文关键字:两个 网格 数据 比较 之间 控件 字段 Winform DevExpress | 更新日期: 2023-09-27 18:08:42

我有2个gridControl,我想改变单元格(行)的背景,不同于2个gridControl,主键是由用户设置的多个字段。
这个问题有什么解决办法吗?

查看这个示例图像

在这两个查询中,关键字段是col1, col2, col3和col4。在col6中不同,我想突出显示具有不同值的单元格。

这是我的RowCellStyle事件的当前代码

 private void gvQuery1_RowCellStyle(object sender, RowCellStyleEventArgs e)
 {
     if (gcQuery2.DataSource == null || lsKey == null || lsKey.Count <= 0)
         return;
     List<object> id = new List<object>();
     foreach (KeyObject key in lsKey)
     {
         id.Add((sender as GridView).GetRowCellValue(e.RowHandle, key.key1[1].ToString()));
     }
     for (int i = 0; i < gvQuery2.RowCount; i++)
     {
         int rowHandle = gvQuery2.GetVisibleRowHandle(i);
         bool flgEqual = true;
         for (int j = 0; j < lsKey.Count; j++)
         {
             object v = gvQuery2.GetRowCellValue(rowHandle, gvQuery2.VisibleColumns[int.Parse(lsKey[j].key2[0].ToString())]);
             if (id[j] == null && v == null)
                 continue;
             if (!id[j].GetType().Equals(v.GetType()) || !id[j].ToString().Equals(v.ToString()))
             {
                 flgEqual = false;
                 break;
             }
         }
         if (flgEqual)
         {
             for (int k = 0; k < (sender as GridView).Columns.Count; k++)
             {
                 if (!(sender as GridView).GetRowCellValue(e.RowHandle, (sender as GridView).Columns[k].FieldName).ToString()
                     .Equals(gvQuery2.GetRowCellValue(rowHandle, (sender as GridView).Columns[k].FieldName).ToString()))
                 {
                     if (e.Column.FieldName.Equals((sender as GridView).Columns[k].FieldName))
                         e.Appearance.BackColor = Color.Orange;
                 }
             }
             break;
         }
     }
 }

DevExpress Winform -如何在多个关键字段的两个网格控件之间比较数据

参考自定义单个行和单元格的外观

您可以使用显示数据表格。RowCellStyle事件。中的每个单元格触发此事件一个网格视图,因此它有ColumnRowHandle参数标识要绘制的单元格。

我假设您在两个网格中都有固定数量的记录,并且记录的顺序相同。然后你可以尝试使用相同的行句柄来访问来自两个网格的MainView在RowCellStyle事件的值,如下所示:

 using DevExpress.XtraGrid.Views.Grid;
    // ... 
    private void gridView1_RowCellStyle(object sender, RowCellStyleEventArgs e) {
       GridView View = sender as GridView;
       GridView leftGridView = leftGrid.MainView as GridView; //It is up to you that which viewtype you have used.
       if(e.Column.FieldName == "Col5") {
          string srcVal= View.GetRowCellDisplayText(e.RowHandle, View.Columns["Col5"]); // You can use GetRowCellValue() method also to get the value from the cell.
          string leftGridVal= leftGridView .GetRowCellDisplayText(e.RowHandle, leftGridView .Columns["Col5"]);
          if(srcVal != leftGridVal) {
             e.Appearance.BackColor = Color.DeepSkyBlue;
             e.Appearance.BackColor2 = Color.LightCyan;
          }
       }
    }

上面的代码片段就像sudo代码,指导你实现功能。在要着色的网格上处理此事件。记住要注意RowHandle,你已经注意到了行索引。

使用GridView.RowCellStyle事件,可以更改单个单元格的外观设置

请参考本网站https://www.devexpress.com/Support/Center/Question/Details/Q520842

 void gridView1_RowCellStyle(object sender, RowCellStyleEventArgs e)
 {
   GridView currentView = sender as GridView;
   if (e.Column.FieldName == "Customer")
   {
     bool value = Convert.ToBoolean(currentView.GetRowCellValue(e.RowHandle, "Flag_Customer"));
     if (value)
        e.Appearance.BackColor = Color.Red;
   }
    if (e.Column.FieldName == "Vendor")
    {
      bool value = Convert.ToBoolean(currentView.GetRowCellValue(e.RowHandle, "Flat_Vendor"));
      if (value)
        e.Appearance.BackColor = Color.Red;
    }
}