0

MySQL InnoDBデータベース内のタイプフィールドにいくつかの画像が保存されており、Blobそれらの画像に関連する他の情報も別のフィールドに保存されています。

ご存知のように、DevExpressバージョン11.2で配布されているBanded Grid Viewは、 Banded Grid Columnsの助けを借りて、いくつかのタイプのデータ、特に画像をレンダリングすることができます。

これまでのところ、すべてのコントロールを作成し、画像を含む必要なあらゆる種類のデータを、を所有するGridControlプロパティを介してcommonandapproachMySqlDataReaderを使用してロードすることができます。DataSet DataSourceBandedGridView

ただし、ご存知のように、MySQLからBlobフィールドをロードすると、ファイルの内容(この場合は問題の画像)を含むバイト配列が返されます。

DevExpressがバイナリデータを認識し、それが画像ファイルであることを認識し、データベースImageフィールドを処理するために割り当てられた列の下のすべての行に画像を自動的にレンダリングすることを期待していましたが、そうではなく、今ではそれがおそらくはるかに希望を持っていた。

画像をレンダリングする代わりに、列の各行には、フィールドに含まれるオブジェクトのタイプを参照する単純な文字列出力が表示されます。この場合、ファイルのバイナリ表現であるため、を出力しますSystem.Byte[]

DevExpressのドキュメントを検索しましたが、一般的にWebで、問題を解決できる明確なものは見つかりませんでした。WinForms->XtraGridセクションの下に「GridMainDemo」という名前のソリューションであるDevExpressと一緒にパックされた私の望ましい結果の例があります。デモを実行したら、代替ビューとバンドグリッドビューに変更し、画像列の下の任意の行をクリックするだけで、希望する結果の明確な例が表示されます。

もちろん、そのデモのソースを調べましたが、明確化と説明がそのようなデモを作成したDevExpressチームの明確な目的であったとは言えません。残念ながら、私はそれを深く調べる時間があまりありませんでした。ただし、このデモは、画像がファイルとしてローカルに保存され、ある種のリポジトリですでに適切に参照されているという点とは異なります。これは、私の問題にはあまり役立ちません。

私の質問を終えるために、長い間読んで申し訳ありませんが、私の目的が何であるか、何が邪魔をしているのか、そして私の目的を達成する方法を見つけるためにすべてのものがどのように設定されているのかを明確に伝えたいと思いました。

さて、長い話を短くします。MySQL Blobフィールドからバンドグリッドビューの列に画像をロードし、ロード後またはユーザーがフィールドセルをクリックしたときにレンダリングする方法の簡単な例が理想的であり、それを使用して理解でき、ビューが画像もレンダリングするように、必要なコードを実行します。

本当にありがとうございました。

注:残念ながら、ローカルまたはリモートに保存されたファイルを使用することはできません。画像はデータベースの範囲内に保持する必要があります。

4

1 に答える 1

0

結局のところ、それほど難しくはなく、希望は十分にあり、DevExpressがほとんどの作業を行ったようです。

したがって、同様の質問がある人を支援するために、これがあなたがしなければならないことです。そうすれば、Blobタイプのフィールドに格納された画像を示す特定の列を持つことができます。

すでにグリッドにデータをロードしていて、もちろん画像を除いて正しく表示されていると仮定します。

最初に:タイプオブジェクトを宣言する必要があります。これは、セルにタイプコントロールをRepositoryItemImageEdit実装するだけImageEditで、セル値を編集しようとすると、この質問の目的である画像が表示されます。その点であなたの目標が異なる場合は、後でこの回答の後のメモを読んでください。

2番目:GridControl.RepositoryItems最後に宣言されたオブジェクトをコレクションプロパティに追加する必要があります。この方法を使用すると、簡単に実行できますAdd

3番目:ここで、[画像]列のデータをレンダリングするために使用するコントロールのタイプを定義する必要があります。そのため、BandedGridColumn.ColumnEditプロパティを参照して、前に追加したオブジェクトと同じにします。

/* Create your columns, bands etc manually or
have it done automatically after loading the data.*/
...
// Load the data from the database to your gridControl
...
// Step one
RepositoryItemImageEdit imageControl = new RepositoryItemImageEdit();
// Step two
gridControl.RepositoryItems.Add(imageControl);
// Step three
/* view is the View assigned to your grid control
where your data and columns are being shown.*/
// Assuming your database blob field is named `Image`
view.Columns["Image"].ColumnEdit = imageControl;

データが正しく読み込まれ、列がそれぞれのフィールドに適切に割り当てられている場合、画像列の各セルに小さなアイコンが表示されます。クリックまたはフォーカスすると、ImageEditコントロールがレンダリングされ、画像が表示されます。

ノート:

画像をレンダリングできる以外にも他のコントロールがあります。それらの他のコントロールについては、それらのベースの実装ImageEditを見つける必要があります。RepositoryItem

また、画像列は編集可能である必要があります。編集可能でない場合、このアプローチは機能しません。OptionsBehavior.Editableプロパティを介してビューレベルで拒否された場合、列レベルでの編集の許可は機能しないことに注意してください。

私の問題を解決する方法について他の誰も洞察を提供しなかったので、私は私の答えを正しいものとしてマークしますが、この問題に対する他の実用的なアプローチを投稿することを歓迎します。ありがとうございました。

于 2012-12-03T03:12:04.910 に答える