首页 > 解决方案 > datagrid 数据表绑定和设置特定单元格的工具提示和背景颜色

问题描述

我有一个绑定到 DataTable 的 DataGrid,autogeneratecolumns=true 因为数据表可以是 Excel 文件中的任何内容。

但是现在我想用红色绘制特定的单元格并添加一个工具提示,这是一条错误消息,当从 Excel 加载数据时,它会出现在验证过程中。

我的目标是将所有有错误的单元格涂成红色。错误出现List<CError>在 CError 可能包含 {row=4,col=6,Error=" the date is wrong"} 这样的数据,因此某些单元格会有错误,我想用红色绘制这些单元格并附加到它们工具提示中的错误,但我找不到方法。我的 DataGrid 定义如下:

在 Viewmodel 中,我有“LoadData()”方法,该方法在按下某个按钮时运行,该函数是:

public List<CError> ErrorInSheet {get;set;}

public void LoadData()
    {
        Sheets= GetSheetsFromExcel(PathExcel);
        SelectedSheet= Sheets.FirstOrDefault();
        MyDataTableFromExcel= LoadDataFromSheet(PathExcel, SelectedSheet);
        ErrorInSheet=ValidateData(MyDataTableFromExcel);

    }

CError 类是这样的:

public class CErrorExcel
{
    public int row { get; set; }
    public int col { get; set; }
    public string Error { get; set; }
}

我的问题是如何仅将数据网格中在验证过程后出现错误的单元格绘制为红色,这些错误将在 ErrorInSheet 集合中

我不知道我是否因为找不到方法而采用了不好的方法来绘制 CErrorExcel 类中指示的单元格。

标签: wpfbindingdatagrid

解决方案


我确实找到了做我之前问过的方法,也许在某些时候我会使用视图模型的方法从 Excel 加载数据,并且在这个过程中我创建了一个错误集合,在加载我的事件处理程序中scrollviwer 我将调用调用到绘制我的 dataGrid 的特定单元格的过程并设置工具提示。这是代码

private async void ScrollViewer_Loaded(object sender, RoutedEventArgs e)
{
    await CargaExcelEnGrid();
}


private async Task CargaExcelEnGrid()
{

    try
    {
        await vm.LoadDatafromExcel(); //loading in the viewmodel
        grdExcel.ItemsSource = null;
        grdExcel.ItemsSource = vm.TableExcel.DefaultView;

        foreach (CErrorExcel error in vm.ErrorExcel)
        {
            DataGridCell cell = GetCell(error.row, error.col, grdExcel);
            cell.Foreground = new SolidColorBrush(Color.FromRgb(255, 0, 0));
            cell.ToolTip = error.Error;
        }
    }
    catch ( Exception err)
    {
        ModernDialog.ShowMessage(err.Message, "Error", MessageBoxButton.OK);
    }
}
public DataGridCell GetCell(int rowIndex, int columnIndex, DataGrid dg)
{
    DataGridRow row = dg.ItemContainerGenerator.ContainerFromIndex(rowIndex) as DataGridRow;
    if (row == null)
    {
        dg.UpdateLayout();
        dg.ScrollIntoView(dg.Items[rowIndex]);
        row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(rowIndex);
    }
    DataGridCellsPresenter p = GetVisualChild<DataGridCellsPresenter>(row);
    DataGridCell cell = p.ItemContainerGenerator.ContainerFromIndex(columnIndex) as DataGridCell;
    return cell;
}

效果很好,希望这对某人有所帮助。

再见


推荐阅读