VB.Net DataGridView ForEach проблема - PullRequest
       6

VB.Net DataGridView ForEach проблема

0 голосов
/ 12 сентября 2018

Я работаю над небольшим приложением VB.net, которое будет отправлять SMS-сообщения о просроченных счетах.Это приложение имеет представление таблицы данных, которое извлекает данные с локального сервера SQL.

Я пытаюсь включить возможность выбора нескольких строк в DGV, и когда я нажимаю кнопку в форме,он выполняет одно и то же действие в каждой строке - в этом случае он должен получить идентификатор запроса, сумму задолженности и номер телефона и отправить сообщение на основе этой информации.

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

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

Любая помощь будет признательна !!

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnSend.Click
    For Each dr As DataGridViewRow In dgResults.SelectedRows
        Dim ref As String = dgResults.SelectedRows(0).Cells(0).Value.ToString
        Dim amt As String = dgResults.SelectedRows(0).Cells(5).Value.ToString
        Dim amtaud As Decimal = amt
        Dim charge As String = amtaud.ToString("C")
        Dim number As String = dgResults.SelectedRows(0).Cells(3).Value.ToString

        Dim baseurl As String
        Dim webclient1 As New WebClient()

        baseurl = "http://api.smsbroadcast.com.au/api-adv.php"

        webclient1.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)")
        webclient1.QueryString.Add("username", "user")
        webclient1.QueryString.Add("password", "pass")
        webclient1.QueryString.Add("to", number)
        webclient1.QueryString.Add("from", "sender")
        If rbDeclined.Checked = True Then webclient1.QueryString.Add("message", "Your account is now due. NutriPATH has received your sample however your credit card details provided has resulted in a declined or invalid card. Please call NutriPATH on 1300688522 to pay for your test to avoid delays in results or alternatively you may pay via our website https://www.bpoint.com.au/payments/nutripath Reference ID " + ref + " Amount Due " + charge)
        If rbOverdue.Checked = True Then webclient1.QueryString.Add("message", "This is a courtesy reminder that your account is now overdue. Please call NutriPATH on 1300688522 to pay for your test to avoid delays in results or alternatively you may pay via our website https://www.bpoint.com.au/payments/nutripathReference ID " + ref + " Amount Due " + charge)
        If rbReceived.Checked = True Then webclient1.QueryString.Add("message", "Your sample has been received and is ready for testing. Please call NutriPATH on 1300688522 to pay for your test to avoid delays or alternatively you may pay via our online payment facility: https://www.bpoint.com.au/payments/nutripathYour Reference ID is " + ref + " Amount Outstanding is " + charge)
        webclient1.QueryString.Add("maxsplit", "3")

        Dim myStream As Stream = webclient1.OpenRead(baseurl)
        Dim sr As New StreamReader(myStream)
        MsgBox(sr.ReadToEnd(), MsgBoxStyle.OkOnly)
             myStream.Close()

    Next
End Sub

Скриншот

1 Ответ

0 голосов
/ 12 сентября 2018

Проблема здесь:

For Each dr As DataGridViewRow In dgResults.SelectedRows
    Dim ref As String = dgResults.SelectedRows(0).Cells(0).Value.ToString
    Dim amt As String = dgResults.SelectedRows(0).Cells(5).Value.ToString
    Dim amtaud As Decimal = amt
    Dim charge As String = amtaud.ToString("C")
    Dim number As String = dgResults.SelectedRows(0).Cells(3).Value.ToString

Управляющая переменная цикла - dr, которая содержит текущую строку, но вместо нее вы используете dgResults.SelectedRows(0), поэтому, конечно, вы получаете одни и те же данные каждый раз: вы используете одну и ту же строку каждый раз. Измените это на это:

For Each dr As DataGridViewRow In dgResults.SelectedRows
    Dim ref As String = dr.Cells(0).Value.ToString
    Dim amt As String = dr.Cells(5).Value.ToString
    Dim amtaud As Decimal = amt
    Dim charge As String = amtaud.ToString("C")
    Dim number As String = dr.Cells(3).Value.ToString

Это For Each циклы 101. Смысл For Each заключается в использовании переменной управления циклом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...