如何在DataGridView中显示之前重新格式化/转换数据查询结果

本文关键字:格式化 转换 结果 数据查询 DataGridView 显示 | 更新日期: 2023-09-27 18:18:31

我使用DataGridView组件快速方便地向用户显示只读SQL查询结果。我让它像我想的那样工作,但我不得不怀疑我是否在用"正确"的方式做事。毕竟这是一个复杂的组件,而且我对。net中的SQL访问和数据绑定完全是新手。

MSDN帮助建议使用BindingSource对象作为中介,因此我提出了以下代码(似乎工作得很好):

mBindingSource.DataSource = null;
mBindingSource.Clear();
using (SqlDataReader query = GetQuery())
{
  if ((query != null) && (query.HasRows))
  {
    mBindingSource.DataSource = query;
    CDataGrid.DataSource = mBindingSource;
  }
}

但是,我想重新格式化一些"原始"数据。例如,一些值在底层表中存储为intbyte类型,但它们实际上表示各种enum值。目前,我正在使用以下代码来执行所需的转换(受此MSDN页面的启发):

private void CDataGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs args)
{
  DataGridViewColumn column = CDataGrid.Columns[args.ColumnIndex];
  switch (column.Name)
  {
    case FieldNameProductID:
    case FieldNameVersionID:
      int? x = args.Value as int?;
      ProductCode code = (ProductCode)(x ?? 0);
      args.Value = code.ToString();
      break;
    case FieldNameProductType:
      byte? y = args.Value as byte?;
      ProductType type = (ProductType)(y ?? 0);
      args.Value = type.ToString();
      break;
  }
}

这是正确的做法吗?我之所以问这个问题,是因为BindingSource对象似乎部分地被设计为执行这种类型的转换。文档很难导航,但是,我还没有找到一个很好的例子,我正在尝试做什么。

如何在DataGridView中显示之前重新格式化/转换数据查询结果

这才是正确的做法。CellFormatting事件在数据呈现之前捕获数据,以便对其进行更改。