2012-07-14 59 views
6

我期待這樣的事情上的DataGridView:C# - 的DataGridView - 圖像和文本在同一行

Image | Text | 
Text | Text | 
Image | Text 

基本上,我只是想在同一行圖像細胞和文本的單元格。 我能得到它與不同類型的工作,例如:複選框,文本,等.. 但我無法得到它與圖像的工作。

我得到這個錯誤:Invalid Cast from 'System.String' to 'System.Drawing.Image'

有誰知道解決的辦法還是對我應該怎麼做這個建議? 謝謝

+1

發表您的ASPX標記這裏 – 2012-07-14 04:48:31

+0

ref1c - 你是否在你的問題中得到行和列混淆?要對同一行的圖片和文字(在不同的列)是微不足道的,只是有一個圖像和文本列。有一個列和圖像和文字是有點棘手。我現在正在爲此做出答案。 – 2012-07-14 14:36:43

回答

7

在某些單元格中顯示文本的列是相對容易的。

所有你需要做的是用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!"; 
} 

此解決方案,如果你想不同的圖像(需要綁定到類型圖像的屬性),如果你想不同的文字留下了你的工作一點點。由於圖像列的Value屬性是Image類型,因此不能使用相同的綁定。

也許你認爲這樣處理你自己的重寫image列,但它是一些工作,可能無法支付本身與簡單的設置值在您想直接文本的單元格。

+0

謝謝,男人!我嘗試過不同的解決方案,但無法做到這一點,我忘了使用'DataGridViewTextBoxCell()'你的解決方案可以幫助我完成我的任務 – 2017-08-09 03:23:40

1

我發現我不得不處理DataGridViewCellFormattingEventHandler並在DataGridViewCellFormattingEventHandler(它退出時拋出異常)中分配圖像。

DataGridViewCellFormattingEventHandler裏面我分配e->Value = System::Drawing::Image::FromFile("c:/Test.jpeg");

e.Value = System.Drawing.Image.FromFile("c:/Test.jpeg");

0

爲了更好的解決方法,請參考本Blogspot職位。

我想爲我的項目相同的解決方案,它運作良好,在我的DataGrid單元格顯示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); 
     } 
    }