31

我想将 DataGridView 控件用作带有列的列表。有点像详细模式下的 ListView,但我想保持 DataGridView 的灵活性。

ListView(启用Details视图和FullRowSelect)突出显示整行并在整行周围显示焦点标记:
ListView 控件中的选定行

DataGridView(使用SelectionMode = FullRowSelect)仅在单个单元格周围显示焦点标记:
DataGridView 中的选定行

那么,有没有人知道一些(理想情况下)使 DataGridView 行选择看起来像 ListView 的简单方法?
我不是在寻找控件的更改行为 - 我只希望它看起来相同。
理想情况下,不要弄乱进行实际绘画的方法。

4

3 回答 3

46

将此代码放入表单的构造函数中,或使用 IDE将其设置在 datagridview 的属性中。

dgv.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dgv.MultiSelect = false;
dgv.RowPrePaint +=new DataGridViewRowPrePaintEventHandler(dgv_RowPrePaint);

然后将以下事件粘贴到表单代码中:

private void dgv_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    e.PaintParts &= ~DataGridViewPaintParts.Focus;
}

它有效!:-)

“dgv”是有问题的DataGridView,“form”是包含它的表单。

请注意,此解决方案不会在整行周围显示虚线矩形。相反,它完全移除了焦点。

于 2008-12-01T16:56:52.077 回答
21

怎么样

SelectionMode == FullRowSelect

ReadOnly == true

这个对我有用。

于 2011-11-29T01:00:23.837 回答
0

如果您希望焦点矩形围绕整行而不是单个单元格,您可以使用以下代码。它假定您的 DataGridView 被命名为 gvMain,并且它的 SelectionMode 设置为 FullRowSelect 并且 MultiSelect 设置为 False。

private void gvMain_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
    // Draw our own focus rectangle around the entire row
    if (gvMain.Rows[e.RowIndex].Selected && gvMain.Focused) 
        ControlPaint.DrawFocusRectangle(e.Graphics, e.RowBounds, Color.Empty, gvMain.DefaultCellStyle.SelectionBackColor);
}

private void gvMain_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    // Disable the original focus rectangle around the cell
    e.PaintParts &= ~DataGridViewPaintParts.Focus;
}

private void gvMain_LeaveAndEnter(object sender, EventArgs e)
{
    // Redraw our focus rectangle every time our DataGridView receives and looses focus (same event handler for both events)
    gvMain.InvalidateRow(gvMain.CurrentRow.Index);
}
于 2021-04-28T16:37:17.517 回答