Подтвердить что ты не робот

Как отменить выбор всех выбранных строк в элементе управления DataGridView?

Я хочу отменить выделение всех выбранных строк в элементе управления DataGridView, когда пользователь нажимает на пустую (нестрочную) часть элемента управления.
Как я могу это сделать?

4b9b3361

Ответ 1

Чтобы отменить выбор всех строк и ячеек в DataGridView, вы можете использовать метод ClearSelection:

myDataGridView.ClearSelection()

Если вы не хотите, чтобы даже первая строка/ячейка была выбрана, вы можете установить свойство CurrentCell Nothing/null, который временно скроет прямоугольник фокуса, пока элемент управления снова не получит фокус:

myDataGridView.CurrentCell = Nothing

Чтобы определить, когда пользователь нажал на пустую часть DataGridView, вам нужно обработать событие MouseUp. В этом случае вы можете HitTest указать местоположение клика и следить за этим, чтобы указать HitTestInfo.Nowhere. Например:

Private Sub myDataGridView_MouseUp(ByVal sender as Object, ByVal e as System.Windows.Forms.MouseEventArgs)
    ''# See if the left mouse button was clicked
    If e.Button = MouseButtons.Left Then
        ''# Check the HitTest information for this click location
        If myDataGridView.HitTest(e.X, e.Y) = DataGridView.HitTestInfo.Nowhere Then
            myDataGridView.ClearSelection()
            myDataGridView.CurrentCell = Nothing
        End If
    End If
End Sub

Конечно, вы можете также подклассифицировать существующий элемент управления DataGridView, чтобы объединить все эти функции в один настраиваемый элемент управления. Вам необходимо переопределить метод OnMouseUp, аналогичный показанному выше. Я также хотел бы предоставить общедоступный метод DeselectAll для удобства, который вызывает метод ClearSelection и устанавливает для свойства CurrentCell значение Nothing.

(Образцы кода произвольны в VB.NET, потому что вопрос не указывает извинения за язык, если это не ваш родной диалект.)

Ответ 2

Спасибо Cody heres С# для ссылки:

if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            DataGridView.HitTestInfo hit = dgv_track.HitTest(e.X, e.Y);
            if (hit.Type == DataGridViewHitTestType.None)
            {
                dgv_track.ClearSelection();
                dgv_track.CurrentCell = null;
            }
        }

Ответ 3

Set

dgv.CurrentCell = null;

когда пользователь нажимает на пустую часть dgv.

Ответ 4

Я узнал, почему моя первая строка была выбрана по умолчанию, и выяснил, как ее не выбрать по умолчанию.

По умолчанию мой datagridview был объектом с первой вкладкой-остановкой в ​​моей форме окна. Перенести вкладку сначала на другой объект (возможно, отключить tabstop для datagrid вообще будет работать) отключить выбор первой строки

Ответ 5

Я столкнулся с той же проблемой и нашел решение (не полностью сам, но есть интернет)

Color blue  = ColorTranslator.FromHtml("#CCFFFF");
Color red = ColorTranslator.FromHtml("#FFCCFF");
Color letters = Color.Black;

foreach (DataGridViewRow r in datagridIncome.Rows)
{
    if (r.Cells[5].Value.ToString().Contains("1")) { 
        r.DefaultCellStyle.BackColor = blue;
        r.DefaultCellStyle.SelectionBackColor = blue;
        r.DefaultCellStyle.SelectionForeColor = letters;
    }
    else { 
        r.DefaultCellStyle.BackColor = red;
        r.DefaultCellStyle.SelectionBackColor = red;
        r.DefaultCellStyle.SelectionForeColor = letters;
    }
}

Это небольшой трюк, единственный способ, которым вы можете видеть, что строка выбрана, - это самый первый столбец (а не столбец [0], но один из них). Когда вы нажимаете другую строку, вы больше не увидите синий выбор, только стрелка указывает, какая строка выбрана. Как вы понимаете, я использую rowSelection в моем gridview.

Ответ 6

В VB.net используйте для Sub:

    Private Sub dgv_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dgv.MouseUp
    ' deselezionare se click su vuoto
    If e.Button = MouseButtons.Left Then
        ' Check the HitTest information for this click location
        If Equals(dgv.HitTest(e.X, e.Y), DataGridView.HitTestInfo.Nowhere) Then
            dgv.ClearSelection()
            dgv.CurrentCell = Nothing
        End If
    End If
End Sub