【发布时间】:2009-12-08 21:08:54
【问题描述】:
如果 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 都存在此问题。)
【问题讨论】:
标签: sql-server visual-studio-2008 datagridview binary-data