wpf - 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 类中指示的单元格。
解决方案
我确实找到了做我之前问过的方法,也许在某些时候我会使用视图模型的方法从 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;
}
效果很好,希望这对某人有所帮助。
再见
推荐阅读
- c++ - 错误:变量或字段“PrintEntity”声明为 void void PrintEntity(Entity e);
- ruby-on-rails - 为权威人士确定正确的范围连接
- wildfly - 我可以启动 Wildfly 忽略部署,然后部署它们吗?
- python - 拟合不同度数时得到相同的R2
- javascript - 在单击事件中显示嵌套数组数据
- sql - SQL 按条件分组行
- docker-swarm - docker swarm 后面的 Traefik 2.0 不工作
- python - 如何将导入的模型转换为顺序模型?
- c# - 当 RichTextBox 被大量数据抽取时,UI 变得无响应
- python - 应用边框直到数据框的最后一行和最后一列