Переключить столбец флажок DataGridView на ColumnHeaderMouseClick - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть DataGridView dgv, у которого в качестве первого столбца есть столбец флажка chkColumn, а затем он заполняется другими столбцами с помощью запроса SQL.

Я хочу иметь возможность щелкнуть chkColumn заголовок и переключатели для всех строк.

Мой текущий код таков, однако нажатие заголовка завершает действие правильно, за исключением выбранной ячейки / строки:

Private Sub chkColumn_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv.ColumnHeaderMouseClick

        Dim checkCount As Integer = 0
        Dim rowsCount As Integer = 0

        For Each row As DataGridViewRow In dgv.Rows
            rowsCount = rowsCount + 1
            If row.Cells("chkColumn").Value = 1 Then
                checkCount = checkCount + 1
            End If
        Next

        If checkCount < rowsCount Then
            For Each row As DataGridViewRow In dgv.Rows
                row.Cells("chkColumn").Value = 1
            Next
        Else
            For Each row As DataGridViewRow In dgv.Rows
                row.Cells("chkColumn").Value = 0
            Next
        End If

    End Sub

1 Ответ

0 голосов
/ 13 декабря 2018

Я подвергаю сомнению ваш комментарий… »щелчок заголовка завершает действие правильно, за исключением любой выбранной ячейки / строки:« … Я согласен с частью о том, что «выбранная» ячейка не переключается.Однако я не согласен с «завершением действия правильно».

Мой тест, выполняющий опубликованный код, показывает, что при нажатии «любой» заголовок столбца «в первый раз» все флажки будут установлены на флажки.Затем любые последующие щелчки в столбце «любой» просто переключат «все» строки на одно и то же значение.То есть после первого щелчка по столбцу все флажки будут одинаковыми.Похоже, вы можете сделать это более сложным, чем должно быть.

Проблема, связанная с тем, что «выбранная» ячейка не переключается, является правильной.Очевидно, что, если ячейка выбрана, ее значение не переключается.Простое решение может состоять в том, чтобы «отключить» сетку перед этим процессом и «включить» ее после переключения.Это зависит от того, есть ли другие возможные события, «ищущие» изменение значения ячейки и т. Д.…

Без подробного описания того, что делают переменные checkCount и rowsCount, я чувствую, что оба не нужны для цели,Кроме того, как я уже говорил ранее, текущий код OP «переключает» значения при нажатии на «любой» столбец.Я могу только предположить, что это не то, что нужно.

Одно из возможных решений размещено ниже.Сначала выполняется проверка, чтобы убедиться, что выбран правильный «столбец» (chkColumn).Если щелкнуть «chkColumn», DataGridView dgv временно отключается, и цикл начинается по всем строкам сетки.Простое решение «переключить» Boolean состоит в том, чтобы принять его отрицание.Это то, что делает код ниже ... значение каждого флажка устанавливается в «противоположное» от его текущего значения.

Возможная проблема с этим подходом может возникнуть из-за того, «как» сетка получает свои данные.Для некоторых источников данных вам может понадобиться другой подход.Надеюсь, это поможет.

Private Sub dgv_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv.ColumnHeaderMouseClick
    If (dgv.Columns(e.ColumnIndex).Name = "chkColumn") Then
        dgv.Enabled = False
        For Each row As DataGridViewRow In dgv.Rows
            If (Not row.IsNewRow) Then
                row.Cells("chkColumn").Value = Not (row.Cells("chkColumn").Value)
            End If
        Next
        dgv.Enabled = True
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...