我有一个data.gridview,它在c#.net中编码 我的要求是,如果我选择任何DataGridView单元格,单元格内容应该作为弹出窗口显示得更大,或者我想在将光标移动到特定单元格时查看更大的数据格式单元格或拟合单元格。
答案 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
我现在已经将代码调整为从数据库直接检索Images
为byte[]
的情况。在这种情况下,Type
属性的Value
不是Image
。相反,一个simlpy需要检查FormattedValue
。
如果显示的已调整大小的Image
太大,则可能会覆盖整个Cell
,并且Cell_Painting
事件不会被触发。因此,我还为RowLeave
事件添加了一个单行,以防止这种情况。
我还添加了几行,以便点击图像。
请更改我用// ***标记的行,添加事件并检查它是否适合你!
以下是两个截图: