我正在使用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;
}
}
但是,我想重新格式化一些“原始”数据。例如,某些值在基础表中存储为int
或byte
类型,但它们实际上表示各种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
对象被设计为部分地执行这种类型的转换。然而,文档难以导航,我还没有找到我正在尝试做的一个很好的例子。
答案 0 :(得分:1)
这是正确的做法。 CellFormatting事件在呈现之前捕获数据,因此可以对其进行更改。