DatagridView установить активную ячейку - PullRequest
0 голосов
/ 29 марта 2020

Я работаю с VB. NET и использую в своей форме сетку данных. Первое действие - кодирование из БД. В этом случае не заполняются все ячейки. Я также установил активную ячейку в первую пустую ячейку. Затем я заполняю недопустимое значение

Я проверяю проверку на CellEndEdit -> msgbox "Wrong Value" -> set value = "" -> set begin edit Теперь проблема Проблема Курсор строки переместился даже в следующая строка

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

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

ОК, спасибо за помощь. Теперь у меня есть следующая проблема. Alfter CellValidatinr переместил курсор строки на следующую строку.

Но я должен установить текущую ячейку на следующее пустое поле, как в Form1_Load. Здесь мой короткий тестовый код

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim i As Int32 = 0
        Dim emptyRow As Int32 = -1
        With Me.DataGridView1
            .Rows.Add(1, "E0", "E0")
            .Rows.Add(1, "", "E0")
            .Rows.Add(1, "E0", "E0")
            .Rows.Add(1, "", "E0")
            .Rows.Add(1, "E0", "E0")
            .Rows.Add(1, "", "E0")
        End With
        For i = 0 To Me.DataGridView1.Rows.Count - 1
            If Me.DataGridView1.Rows(i).Cells(1).FormattedValue.ToString = "" Then
                emptyRow = i
                Exit For
            End If
        Next
        If emptyRow > -1 Then
            Me.DataGridView1.CurrentCell = Me.DataGridView1(1, emptyRow)
        End If
    End Sub

    Private Sub DataGridView1_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
        e.Cancel = (e.ColumnIndex = 1 AndAlso e.FormattedValue.ToString <> "E0")
        If e.Cancel Then
            Me.txtMsg.Text = "Ungülitger Barcode"
            Me.DataGridView1.CancelEdit()
        End If
    End Sub

End Class

Какое событие может Я использую для установки CurrentCell на следующие пустые ячейки (1)

0 голосов
/ 29 марта 2020

Если вы хотите запретить пользователю покидать текущую ячейку, если он установил неправильное значение, установите e.Cancel = True в событии CellValidating. Например, этот код останавливает пользователя, покидающего ячейку во втором столбце, если он не набрал число:

    Private Sub dataGridView1_CellValidating(sender as Object, e as DataGridViewCellValidatingEventArgs e) Handles dataGridView1.CellValidating

        'set cancel to true if colindex is 1 and TryParse returned false (not a number)
        e.Cancel = (e.ColumnIndex = 1 AndAlso Not Int32.TryParse(e.FormattedValue.ToString(), Nothing)

    End Sub

Чтобы очистить редактор ввода, вы должны понимать, что вы не редактируете ячейка, вы вводите в текстовое поле, которое рисуется в верхней части места, где находится ячейка. Концептуально, только одно текстовое поле редактора для каждой таблицы данных одновременно (и оно помещает его в любое место, соответствующее текущей ячейке). Элемент управления, который редактирует значение для текущей ячейки, следовательно, не имеет ничего общего с ячейкой, но является особенностью самой сетки и доступен dataGridView1.EditingControl. Это возвращает элемент управления; это может быть любой вид элемента управления форм (текстовое поле, флажок, datepicker и т. д. c), который редактирует ячейку, поэтому EditingControl возвращает базовый класс Control. Элемент управления имеет свойство .Text и метод .ResetText(), поэтому мы можем очистить текстовое поле без необходимости его приведения (но если бы мы использовали средство выбора даты и т. Д. c, возможно, ему потребовалось бы преобразование перед, например, доступом к его значению) , Это может сбросить текстовое поле:

    Private Sub dataGridView1_CellValidating(sender as Object, e as DataGridViewCellValidatingEventArgs e) Handles dataGridView1.CellValidating


        If e.ColumnIndex = 1 AndAlso Not Int32.TryParse(e.FormattedValue.ToString(), Nothing) Then
            e.Cancel = true
            dataGridView.EditingControl.ResetText()
        End If

    End Sub
...