使选定的DataGridView Cell内容更大

时间:2014-09-11 10:40:24

标签: c# view datagridview

我有一个data.gridview,它在c#.net中编码 我的要求是,如果我选择任何DataGridView单元格,单元格内容应该作为弹出窗口显示得更大,或者我想在将光标移动到特定单元格时查看更大的数据格式单元格或拟合单元格。

1 个答案:

答案 0 :(得分: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[]的情况。在这种情况下,Type属性的Value不是Image。相反,一个simlpy需要检查FormattedValue

如果显示的已调整大小的Image太大,则可能会覆盖整个Cell,并且Cell_Painting事件不会被触发。因此,我还为RowLeave事件添加了一个单行,以防止这种情况。

我还添加了几行,以便点击图像。

请更改我用// ***标记的行,添加事件并检查它是否适合你!

以下是两个截图:

Image Enlarged Text Enlarged