2014-09-11 102 views
0

我有一個datagridview編碼在c#.net
我的要求是,如果我選擇任何DataGridView單元格的單元格內容應該是可見較大的彈出,或我想查看datagridview當我的光標移動到特定的單元格時,單元格變大或合適。使選定的DataGridView單元格內容更大

+0

會不會有在細胞哪些類型的內容?只是文本和數字或圖像,按鈕等?另外:放大後內容是否仍可編輯? – TaW 2014-09-11 10:52:21

+0

主要內容是文字和圖片,有些是數字......最後所有類型的表演都在那裏@TaW – 2014-09-11 10:58:41

+0

你解決了你的問題嗎? – TaW 2014-09-18 07:26:39

回答

0

對於文本和數字,這可能做什麼,你需要:

private void dataGridView1_CellPainting(object sender, 
             DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.RowIndex < 0 | e.ColumnIndex < 0) return; 
    if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected) 
    { 
    e.Graphics.FillRectangle(SystemBrushes.Highlight, e.CellBounds); 
    e.Graphics.DrawString(e.Value.ToString(), new Font(e.CellStyle.Font.FontFamily, 
    e.CellStyle.Font.Size * 1.5f), SystemBrushes.HighlightText, e.CellBounds.Location); 
    e.Handled = true; 
    } 
} 

您可能需要使用e.FormattedValue而不是e.Value如果你正在使用的格式

您可能還需要插入的測試單元格值的類型..

此代碼會將字體放大50%,而不處於編輯模式。

對於圖像不同的解決方案將是必要的 - 可能是一個彈出式標籤或面板;但這真的取決於你想要什麼和他們是什麼樣的圖像。圖標我會離開,用戶的照片將從放大的顯示中獲益。

當然,如果放大的內容實際不適合在Cell彈出溶液也將被稱爲爲..

Upadate

這裏是一個測試柱的延伸Value/FormattedValue和爲Bitmap顯示Image在彈出Label

Label imageLabel; 
bool labelHide = false;              //*** new 

void showImageLabel(DataGridViewCellPaintingEventArgs e) 
{ 
    if (labelHide) return;             //*** new 
    if (imageLabel == null) imageLabel = new Label(); 
    imageLabel.Click += (sender, evt) => 
         { ((Label)sender).Hide(); labelHide = true; };  //*** new 

    imageLabel.Text = ""; 
    imageLabel.Parent = dataGridView1; 
    imageLabel.Location = e.CellBounds.Location; 
    if (imageLabel.Image != null) imageLabel.Image.Dispose(); 
    //Size size = ((Bitmap)e.Value).Size;         //*** old 
    Size size = ((Bitmap)e.FormattedValue).Size;       //*** new 
    Size newSize = new Size((int)(size.Width * 1.5f), (int)(size.Height * 1.5f)); 
    //Bitmap bmp = new Bitmap((Bitmap)e.Value, newSize);     //*** old 
    Bitmap bmp = new Bitmap((Bitmap)e.FormattedValue, newSize);    //*** new 
    imageLabel.Size = newSize; 
    imageLabel.Image = bmp; 
    imageLabel.Show(); 
} 

private void dataGridView1_CellPainting(object sender, 
             DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.RowIndex < 0 | e.ColumnIndex < 0) return; 
    if (e.Value == null) { if (imageLabel != null) imageLabel.Hide(); return; } 
    if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected) 
    { 
     //if (e.Value.GetType() == typeof(Bitmap))       //*** old 
     if (e.FormattedValue.GetType() == typeof(Bitmap))     //*** new 
     { 
      showImageLabel(e); 
      e.Handled = true;            //*** old 
      if (labelHide) labelHide = false; else e.Handled = true;  //*** new 
      return; 
     } 
     else if (imageLabel != null) imageLabel.Hide(); 

     e.Graphics.FillRectangle(SystemBrushes.Highlight, e.CellBounds); 
     e.Graphics.DrawString(e.FormattedValue.ToString(), 
       new Font(e.CellStyle.Font.FontFamily, e.CellStyle.Font.Size * 1.5f), 
       SystemBrushes.HighlightText, e.CellBounds.Location); 
     e.Handled = true; 
    } 
} 

private void dataGridView1_RowLeave(object sender, DataGridViewCellEventArgs e) 
{ 
    if (imageLabel != null) imageLabel.Hide(); 
} 

您可能需要調整位置是如居中..

更新2

我現在已經適應的代碼直接從數據庫中檢索作爲Imagesbyte[]的情況下。在這種情況下,Value財產的Type不是Image。相反,一個simlpy需要檢查FormattedValue

如果顯示的,調整大小的Image太大,它可能覆蓋整個Cell並且Cell_Painting事件不會被觸發。因此,我還爲RowLeave事件添加了一行,以防止發生這種情況。

我還添加了幾行讓圖像被點擊。

請更改我標記爲// ***的行,添加事件並檢查它是否適用於您!

這裏有兩個截圖:

Image EnlargedText Enlarged

+0

好吧,我會用彈出窗口更新答案,稍後會放大顯示圖片。我們之前和之後討論的尺寸是多少? – TaW 2014-09-12 05:55:56

+0

在執行解決方案時,通常會幫助您瞭解詳細信息。看到我更新的答案! – TaW 2014-09-12 06:56:35

+0

你可以發佈將圖像插入到dgv的代碼嗎? – TaW 2014-09-19 16:25:07

相關問題