DataGridView:如何聚焦整行而不是单个单元格?

时间:2008-11-12 23:38:01

标签: .net winforms datagridview

我想将DataGridView控件用作列的列表。在详细信息模式下类似于ListView,但我希望保持DataGridView的灵活性。

ListView (启用了详细信息视图和 FullRowSelect )突出显示整行,并在整行显示焦点标记:
selected row in ListView control

DataGridView (使用 SelectionMode = FullRowSelect )仅在单个单元格周围显示焦点标记:
selected row in DataGridView

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

3 个答案:

答案 0 :(得分:44)

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

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”是包含它的 Form

请注意,此衍生物不会在整行显示虚线矩形。相反,它完全消除了焦点。

答案 1 :(得分:18)

怎么样

SelectionMode == FullRowSelect

ReadOnly == true

它对我有用。

答案 2 :(得分: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);
}