GalaxyMan Ответов: 1

Практическое руководство поиск петлю


Я хочу найти throw DataGridView, если я нахожу ячейку в записи, начинающуюся с "51", сделать что-то, если звезды с "52" делают что-то, если начинается с" 53 " что-то

код работает если записи являются ордерами типа 51 52 53 но если это 51 51 52 52 53 он выбирает первую запись и останавливается

Я хочу, чтобы он выбрал первую запись, которая начинается с (51), (52),(53) если таковые имеются

это код
<pre>Public Sub StartAllSend()  
        Dim currRowNum As String  
        Dim currRowAmount As String  
        Dim currVRowNum As String  
        Dim currVRowAmount As String  
        Dim currERowNum As String  
        Dim currERowAmount As String  
        Dim r As Integer  
        Dim SrCell As String  
        <pre>If InvoiceDataGridView.Rows.Count > 1 Then
            For Each row As DataGridViewRow In InvoiceDataGridView.Rows
                If Not row.IsNewRow Then
                    SrCell = InvoiceDataGridView.Rows(r).Cells(1).Value 
                    If SrCell <> "" Then  
                        If SrCell.StartsWith("51") Then  
                            If txtMobiNorNumber.Text = "" And cmdUSSD.Enabled = True Then  
                                'InvoiceDataGridView.Rows(r).Selected = True  
                                lblMNo.Text = 0  
                                currRowAmount = InvoiceDataGridView.CurrentRow.Cells(3).Value  
                                currRowNum = InvoiceDataGridView.CurrentRow.Cells(1).Value  
                                currRowUser = "Buy"  
                                currRowUserID = InvoiceDataGridView.CurrentRow.Cells(0).Value  
                                txtMobiNorNumber.Text = currRowNum  
                                cboMobiNorAmount.Text = (Int(currRowAmount))  
                                InvoiceDataGridView.Rows.Remove(InvoiceDataGridView.Rows(r))  
                            End If  
                        ElseIf SrCell.StartsWith("52") Then  
                            If txtMobiNorNumber2.Text = "" And cmdUSSD2.Enabled = True Then  
                                'InvoiceDataGridView.Rows(r).Selected = True  
                                lblVNo.Text = 0  
                                currVRowAmount = InvoiceDataGridView.CurrentRow.Cells(3).Value  
                                currVRowNum = InvoiceDataGridView.CurrentRow.Cells(1).Value  
                                currVRowUser = "Sell"  
                                currVRowUserID = InvoiceDataGridView.CurrentRow.Cells(0).Value  
                                txtMobiNorNumber2.Text = currVRowNum  
                                cboMobiNorAmount2.Text = (Int(currVRowAmount))  
                                InvoiceDataGridView.Rows.Remove(InvoiceDataGridView.Rows(r))  
                            End If  
                        ElseIf SrCell.StartsWith("53") Then  
                            If txtMobiNorNumber3.Text = "" And cmdUSSD3.Enabled = True Then  
                                ' InvoiceDataGridView.Rows(r).Selected = True  
                                lblENo.Text = 0  
                                currERowAmount = InvoiceDataGridView.CurrentRow.Cells(3).Value  
                                currERowNum = InvoiceDataGridView.CurrentRow.Cells(1).Value  
                                currERowUser = "Empty"  
                                currERowUserID = InvoiceDataGridView.CurrentRow.Cells(0).Value  
                                txtMobiNorNumber3.Text = currERowNum  
                                cboMobiNorAmount3.Text = (Int(currERowAmount))  
                                InvoiceDataGridView.Rows.Remove(InvoiceDataGridView.Rows(r))  
                            End If  
  
                        End If  
                    End If  
                End If  
            Next  
        End If  
    End Sub<pre>

What I have tried:

I want it to select the First record that Starts with (51), (52),(53) if there any

Michael_Davies

SrCell всегда является первой ячейкой того, что r есть, r не должно быть ничем, поскольку оно не было назначено. Вы также используете r, чтобы установить selected = true, r еще не имеет значения, row делает это, вам не нужно выбирать строку, если вы не собираетесь этого делать, и знайте, что событие сработает, когда вы это сделаете, и любой обработчик будет вызван.

Если InvoiceDataGridView.Строк.Тогда посчитайте > 1
Для каждой строки, а ячейки datagridviewrow в InvoiceDataGridView.Строк
Если не грести.IsNewRow Тогда
SrCell = строка.Ячейки (1). Значение
ряд.Selected = True ' вам не нужно этого делать, Используйте row вместо InvoiceDataGridView.CurrentRow через остальную часть вашего кода, это ускорит процесс

Не уверен в эффекте удаления строк во время итерации, поскольку это изменяет коллекцию, которая повторяется, лично я бы сделал это как индекс, установленный на шаг count -1 до 0 -1;

Для R = InvoiceDataGridView.Строк.Отсчет от -1 до 0 шаг -1
...
currRowAmount = InvoiceDataGridViewRow (r).Ячейки (3). Значение
...
Следующий

Затем вы можете использовать r в качестве индекса для строк, и удаление строки не повлияет на цикл, так как он идет назад.

GalaxyMan

Я изменил код, но все равно тот же
просто возьмите первую пластинку и остановитесь
например
первая запись звезды с (51)
Второй (51)
третий (52)
он берет первую (51) запись и не берет первую (52) запись

CHill60

Предназначена ли эта функция StartAllSend () для поиска по всей сетке или она вызывается откуда-то еще? Если это вызывается для каждой строки в сетке, то вы будете перезаписывать текст в текстовых полях при перемещении по сетке.
Возможно, вам лучше объяснить, что вы хотите сделать, потому что этот код вообще не имеет никакого смысла

GalaxyMan

он должен просто взять только первый ряд начинается с (51),(52),(53)

1 Ответов

Рейтинг:
4

CHill60

Ну, вы не очень хорошо объяснили эту проблему,но вот несколько идей, которые помогут вам начать.
Во-первых, найдите только первую строку, которая начинается с 51, 52 или 53...

  Private Sub btnSearchDGV_Click(sender As Object, e As EventArgs) Handles btnSearchDGV.Click
        'This function will locate the FIRST row starting with 51, 52 or 53
        'It will then handle that row setting some other control values
        'It will then delete the row that it found

        Dim rowToDelete = -1
        For Each r As DataGridViewRow In InvoiceDataGridView.Rows
            Dim cValue As String = r.Cells(1).Value.ToString()
            If cValue.StartsWith("51") Or cValue.StartsWith("52") Or cValue.StartsWith("53") Then
                Select Case cValue.Substring(0, 2)
                    Case "51"
                        Handle51()
                    Case "52"
                        Handle52()
                    Case "53"
                        Handle53()
                End Select

                rowToDelete = r.Index
                Exit For 'So we only handle the first one we find
            End If
        Next

        'Delete the row we have just processed, if we have processed one
        If rowToDelete > -1 Then
            InvoiceDataGridView.Rows.RemoveAt(rowToDelete)
        End If
End Sub

В качестве альтернативы, если вы хотите пройти через все строки, которые начинаются с 51, 52 или 53...
Private Sub btnSearchAllDGV_Click(sender As Object, e As EventArgs) Handles btnSearchAllDGV.Click
    'This function will locate ALL the rows starting with 51, 52 or 53
    'It will then handle each row setting some other control values
    'It will then delete each row that it found

    For row As Integer = InvoiceDataGridView.Rows.Count - 1 To 0 Step -1

        Dim cValue As String
        If Not IsNothing(InvoiceDataGridView.Rows(row).Cells(1).Value) Then
            cValue = InvoiceDataGridView.Rows(row).Cells(1).Value.ToString()

            If cValue.StartsWith("51") Or cValue.StartsWith("52") Or cValue.StartsWith("53") Then
                Select Case cValue.Substring(0, 2)
                    Case "51"
                        Handle51()
                    Case "52"
                        Handle52()
                    Case "53"
                        Handle53()
                End Select

                InvoiceDataGridView.Rows.RemoveAt(row)
            End If
        End If
    Next
End Sub

Обратите внимание, что подпрограммы Handle51, Handle52 и Handle53 будут находиться там, где вы устанавливаете содержимое других текстовых полей и т. д. Не пытайтесь удалить какие-либо строки из DataGridView в этих подпрограммах.


GalaxyMan

большое спасибо ваш второй код делает то что именно я хочу
спасибо снова

Karthik_Mahalingam

5