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に設定されていることがわかります。なんで?なぜなら、Microsoftによれば、.NETはバイナリ列がイメージであると想定しているからです。実際、Microsoftは、この動作は仕様によるものであると断言しています。Microsoft Connectに関するこの欠陥レポートを参照してください:http ://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID = 93639
ダイアログが丁寧に示しているように、DataGridViewのDataErrorイベントを処理することでエラーダイアログを抑制することができますが、それは疑問を投げかけます。そもそもエラー状態にならないようにする方法を見つけたい。つまり、「0x1234a8e9433bb2」のように、バイナリデータのテキスト表現を表示するDataGridViewTextColumnが必要です。そして、私の実際のコードは上記の例のように特定のテーブルを使用していないため、一般的な解決策を探しています。むしろ、dataAdapter.SelectCommandにいくらか任意のクエリを入れてから、
dataAdapter.Fill(dataTable)
dataTableを自動生成します。(IMHO)バグがあるのはDataGridViewであるため、データテーブルの列をチェックする必要があると考えています(つまり、dataTable.Columns [n] .DataType.Name.Equals( "Byte []")?) dataTableをDataGridViewに接続する前に、バイト配列を手動でテキスト形式に変換します。
bindingSource.DataSource = dataTable;
私の質問:
DataGridViewにバイナリ列を表示するためのより簡単またはより洗練された方法はありますか?
(この問題は、VS2005とVS2008、.NET2.0と.NET3.5の両方に存在することに注意してください。)