仅选择ImageandText Datagridview列中的Text

时间:2014-09-19 11:06:40

标签: c# winforms datagridview datagridviewcolumn

我在DatagridView中显示了一些行,它们将第一列作为ImageandText。当用户通过将图像背景保持为白色来选择我想要选择的任何行,直到具有文本部分的单元格。

用于在DataGridView的第一个单元格中显示图像和文本的代码:

private void dgvLogDetails_CellPainting(object sender, 
                                            DataGridViewCellPaintingEventArgs e)
    {

        if (e.RowIndex >= 0 && e.ColumnIndex == 0)
        {                
            e.PaintBackground(e.ClipBounds, true);
            PointF p = e.CellBounds.Location;
            e.CellStyle.SelectionBackColor = Color.White;
            p.X += imgList.ImageSize.Width+8;


            e.Graphics.DrawImage(imgList.Images[1], e.CellBounds.X+4, 
                                                 e.CellBounds.Y, 16, 16);
            e.Graphics.DrawString(e.Value.ToString(), 
                                            e.CellStyle.Font, Brushes.Black, p);
            e.Handled = true;
        }

    }

上面的代码选择完整的单元格(图像和文本),如下图所示: enter image description here

我希望有如下图所示的内容[预期]:

enter image description here

尝试过Sriram代码,显示如下:

enter image description here

1 个答案:

答案 0 :(得分:1)

这样的事情应该可以解决问题。

调用e.PaintBackground,将第二个参数设置为false,这意味着它不会为您绘制选择背景,然后您可以自己绘制。

private void dgvLogDetails_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.RowIndex >= 0 && e.ColumnIndex == 0)
    {
        Bitmap image = imgList.Images[1];//Get the image somewhow

        bool selected = e.State.HasFlag(DataGridViewElementStates.Selected);
        e.PaintBackground(e.ClipBounds, false);

        PointF p = e.CellBounds.Location;
        p.X += image.Size.Width + 8;

        if (selected)
        {
            RectangleF newRect = new RectangleF(new PointF(e.CellBounds.Left + image.Size.Width, e.CellBounds.Top), new SizeF(e.CellBounds.Width - image.Size.Width, image.Height));
             using(SolidBrush brush = new SolidBrush(e.CellStyle.SelectionBackColor))
                 e.Graphics.FillRectangle(brush, newRect);
        }
        e.Graphics.DrawImage(imgList.Images[1], e.CellBounds.X+4, 
                                             e.CellBounds.Y, 16, 16);
        e.Graphics.DrawString(e.Value.ToString(), 
                                        e.CellStyle.Font, Brushes.Black, p);
        e.Handled = true;
    }
}

这是它呈现的输出:

enter image description here