GD Все,

Я ищу решение моей проблемы ниже.

У меня есть форма с несвязанным datagridview, в dg есть один добавленный столбец, который позволяет пользователю выбрать метод, который будет использоваться. Состояние события сохраняется в базе данных, и после повторного открытия формы код проверяет, находится ли событие в «открытом» состоянии, если да, он сравнивает ранее выбранный метод с методами в сетке данных и должен установить ранее активированный метод будет «выбранным» методом.

Но, к сожалению, я не могу заставить это работать ...

Приведенный ниже код просматривает методы в dg и сравнивает значения, если он соответствует идентификатору метода, он должен установить значение True или TrueValue в любом случае.

Это инициализируется, если проверка базы данных возвращает истину и после полной инициализации формы, где session.methodID - поле в возвращенном запросе LINQ.

For Each r As DataGridViewRow In dgMethods.Rows

   If r.Cells(1).Value = session.methodID Then
      Dim c As DataGridViewCheckBoxCell = r.Cells(0)
      c.Value = c.TrueValue
   End If

Next

К сожалению, это не устанавливает флажок «Проверено». Цикл выполняется и оценивает правильность сравнения между r.Cells(1).Value и session.methodID и срабатывает правильно.

Интересно то, что если я делаю аналогичный цикл после события CellContentClick, он делает именно то, что от него ожидается. (в приведенном ниже примере все значения флажков устанавливаются как отмеченные)

Private Sub dgMethods_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgMethods.CellContentClick

    'Only single selection allowed, so clear table before submitting new selection
    For Each r As DataGridViewRow In dgMethods.Rows
        Dim c As DataGridViewCheckBoxCell = r.Cells(0)
        c.Value = c.TrueValue

    Next

    dgMethods.CommitEdit(DataGridViewDataErrorContexts.Commit)

End Sub

Итак, очевидно, есть разница в состоянии между простым вызовом цикла для dgMethods и тем, когда сработало событие dgMethods.CellContentClick, но я не знаю, какое именно? Есть много сообщений о попытке установить столбец CheckBox, но мне не удалось заставить ни один из них работать.

У кого-нибудь есть идеи?

Буду признателен за ваши предложения?

0
mtholen 17 Апр 2016 в 16:23

2 ответа

Лучший ответ

GD Все,

После дальнейших поисков я обнаружил следующее интересное поведение.

Процесс выбора метода является частью формы под названием 'frmAddEvent', форма frmAddEvent вызывается из основной формы с использованием процедуры ниже.

Новый экземпляр формы создается и затем заполняется с помощью общедоступного подпрограммы в классе формы под названием InitializeForm(), который использует параметр GUID для извлечения соответствующих данных для установки полей формы.

If Not (isOpened(rsTankName.unqID)) Then
   Dim newForm As New frmAddEvent() '(rsTankName)
   newForm.InitializeForm(rsTankName)
   newForm.Show()

Else

End If

Подложка инициализации запрашивает несколько таблиц данных и правильно устанавливает соответствующие поля в новом экземпляре формы, если это применимо. Частью этой настройки является выбор method в панели данных dgMethods.

Казалось бы, последовательность, в которой вы вызываете форму, имеет большое значение, поскольку приведенный ниже код работает идеально:

If Not (isOpened(rsTankName.unqID)) Then
   Dim newForm As New frmAddEvent() '(rsTankName)

   newForm.Show()
   newForm.InitializeForm(rsTankName)
Else

End If

Таким образом, вызов newForm.InitializeForm(rsTankName) после события newForm.Show позволяет datagridview правильно установить CheckBoxColumn.

Вероятно, потому что фактический CheckBox фактически создается только при выполнении команды Show, несмотря на тот факт, что он «доступен» как ячейка со свойствами DataGridViewCheckBoxColumn в сетке данных, непосредственно после того, как New frmAddEvent создал новый экземпляр формы. Фактический CheckBox и соответствующий ему CheckedState не создаются до вызова события newForm.Show. Казалось бы, когда CheckBox создается для отображения (во время события newForm.Show), сравнение с его фактическим значением не производится.

Таким образом, чтобы установить столбец Checkbox при запуске новой формы, вы должны вызвать событие Show до установки значений DataGridViewCheckBoxColumn, иначе CheckBox не будет отображать его как «Checked».

0
mtholen 18 Апр 2016 в 02:22

Я не был уверен, что понял ваш вопрос ... но есть простой способ проверить и изменить состояние ячейки флажка в datagridview:

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        For Each dr As DataGridViewRow In DataGridView1.Rows
            If CBool(dr.Cells(0).Value) = True Then dr.Cells(0).Value = False : Continue For
            If CBool(dr.Cells(0).Value) = False Then dr.Cells(0).Value = True
        Next

    End Sub

В этом примере, когда вы нажимаете эту кнопку для каждой строки в datagridview, проверяет ячейку флажка и устанавливает значение FALSE или TRUE в зависимости от его значения.

Надеюсь, это тебе поможет.

И позвольте мне еще один совет. Если вы получаете доступ к ячейкам для его имени, а не его индекса, используйте его имя, это должно помочь вам избежать проблем;)

0
Ivan Font 17 Апр 2016 в 18:28