2012-07-14 8 views
6

私はDataGridViewの上でこのような何かを探しています:C# - DataGridViewの - 同じ行上の画像とテキスト

Image | Text | 
Text | Text | 
Image | Text 

基本的に、私はちょうど同じ行上の画像セルとテキストのセルをしたいです。 チェックボックスやテキストなど、さまざまな種類のものを扱うことができました。 しかし、画像を扱うことができません。

私はこのエラーを取得する:Invalid Cast from 'System.String' to 'System.Drawing.Image'

誰もが解決策を知っているか、私はこれを行うべきかについての提案を持っていますか? ありがとう

+1

はここ –

+0

をあなたのASPXマークアップを投稿しますref1c - あなたの質問に混乱している行と列がありますか?同じ行(異なる列にある)にイメージとテキストを置くのは簡単ですが、イメージとテキスト列があります。イメージとテキストの両方で1つの列を作成するのはちょっと面倒です。私は今、その答えに取り組んでいます。 –

答えて

7

特定のセルに表示するテキストがDataGridViewImageColumnのテキストを持つのは比較的簡単です。

あなたがする必要があるのは、希望のセルをDataGridViewTextBoxCellに置き換えることだけです。私は私のグリッドに、次の画像の列を追加する場合

だから、たとえば、:

DataGridViewImageColumn imageColumn = new DataGridViewImageColumn(); 
imageColumn .Name = "ImageColumn"; 
imageColumn .HeaderText = "An Image!"; 
Image i = Image.FromFile(@"C:\Pictures\TestPicture.jpg"); 
imageColumn.Image = i; 
dataGridView1.Columns.Add(imageColumn); 

あなたがそう(ここではボタンハンドラのようにテキストで指定したセルを置き換えることができますが、あなたはまた、どこかのようにそれを行うことができますデータバインド完了ハンドラ内で)。あなたが別のテキストをしたい場合は、(あなたがタイプの画像のプロパティにバインドする必要があります)異なる画像をしたいと場合

private void button1_Click(object sender, EventArgs e) 
{ 
    dataGridView1.Rows[3].Cells["ImageColumn"] = new DataGridViewTextBoxCell(); 
    dataGridView1.Rows[3].Cells["ImageColumn"].Value = "Some text!"; 
} 

このソリューションは、あなたのために仕事を少し残します。 image列のValueプロパティはImage型であるため、同じバインディングを使用することはできません。

これを処理した独自のオーバーライドされたイメージ列を作成することもできますが、テキストを直接表示するセルの値を設定するのではなく、単価がかかりません。

+0

ありがとう、男!!!私は別のソリューションで試してみましたが、できなかったのはあなたのソリューションが私の仕事を達成するのに役立つ 'DataGridViewTextBoxCell()'を使うのを忘れたことです –

1

私はDataGridViewCellFormattingEventHandlerを処理し、DataGridViewCellFormattingEventHandler(これは終了時に例外を投げていました)の画像を割り当てる必要があることがわかりました。私はよりよい解決策についてe->Value = System::Drawing::Image::FromFile("c:/Test.jpeg");
または
e.Value = System.Drawing.Image.FromFile("c:/Test.jpeg");

0

を割り当てDataGridViewCellFormattingEventHandlerインサイド

は、このBlogspot記事を参照してください。

が、私は私のデータグリッドセルに16×16ピクセルの画像を表示するために、うまく機能している、私のプロジェクトのために同じソリューションを試してみました、私は上記のTextandImageColumnクラス内の関数を編集した:

protected override void Paint(Graphics graphics, Rectangle clipBounds, 
    Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, 
    object value, object formattedValue, string errorText, 
    DataGridViewCellStyle cellStyle, 
    DataGridViewAdvancedBorderStyle advancedBorderStyle, 
    DataGridViewPaintParts paintParts) 
    { 
     // Paint the base content 
     base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, 
      value, formattedValue, errorText, cellStyle, 
      advancedBorderStyle, paintParts); 

     if (this.Image != null) 
     { 
      PointF p = cellBounds.Location; 
      p.X += 0; 
      p.Y += 4; 

      graphics.DrawImage(this.Image, p); 
     } 
    } 
関連する問題