【问题标题】:datagrid datatable binding and setting specific cell's tooltip and background colordatagrid 数据表绑定和设置特定单元格的工具提示和背景颜色
【发布时间】:2019-03-27 01:28:40
【问题描述】:

我有一个绑定到 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 类中指示的单元格的方法而采用了不好的方法。

【问题讨论】:

    标签: wpf binding datagrid


    【解决方案1】:

    我确实找到了做我之前问过的方法,也许一段时间会对某人有用 我确实使用视图模型的方法从 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;
    }
    

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

    再见

    【讨论】:

      猜你喜欢
      • 2012-03-07
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多