如果 DataSet 包含作为时间戳或其他二进制值的列,则在显示该列中的任何数据时,其关联的 DataGridView 将引发 ArgumentException。也就是说,假设您有一些包含二进制列的表,例如:
CREATE TABLE [dbo].[DataTest](
[IdStuff] INT IDENTITY(1,1) NOT NULL,
[ProblemColumn] TIMESTAMP NOT NULL )
在 Visual Studio 2008 中,添加一个指向可疑表的新数据源。将表格从数据源资源管理器拖到新 WinForm 的可视化设计器表面上,以自动创建 DataGridView、BindingSource 等。执行应用程序,您将获得运行时异常。听起来像个缺陷,对吧?
如果您检查 DataGridView 的 Columns 集合,您会发现它将列类型设置为 DataGridViewImageColumn。为什么?因为,根据微软的说法,.NET 假定二进制列是图像。事实上,微软确认这种行为是设计使然!请参阅 Microsoft Connect 上的此缺陷报告:http ://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93639
正如对话框礼貌地指出的那样,可以通过处理 DataGridView 的 DataError 事件来抑制错误对话框,但这引出了问题。我想找到一种方法来避免首先出现错误情况。也就是说,我想要一个 DataGridViewTextColumn 显示二进制数据的文本表示,例如“0x1234a8e9433bb2”。我正在寻找一个通用的解决方案,因为我的实际代码没有使用上面示例中的特定表。相反,我将一些任意查询放入 dataAdapter.SelectCommand,然后调用
dataAdapter.Fill(dataTable)
自动生成我的数据表。由于 DataGridView 有(恕我直言)错误,我想我需要检查数据表的列(即 dataTable.Columns[n].DataType.Name.Equals("Byte[]") ?)并在我将 dataTable 连接到 DataGridView 之前手动将任何字节数组转换为它们的文本形式
bindingSource.DataSource = dataTable;
那我的问题:
有没有更简单或更优雅的方式在 DataGridView 中显示二进制列?
(请注意,VS 2005 和 VS 2008、.NET 2.0 和 .NET 3.5 都存在此问题。)