2014-09-11 106 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

相关问题