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

时间:2011-12-20 23:50:12

标签: c# .net datagridview bindingsource

我正在使用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值。目前,我使用以下代码执行所需的转换(受this MSDN page启发):

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对象被设计为部分地执行这种类型的转换。然而,文档难以导航,我还没有找到我正在尝试做的一个很好的例子。

1 个答案:

答案 0 :(得分:1)

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