Member 13273771 Ответов: 1

Суммируйте повторяющиеся значения в нескольких представлениях datagridviews в VB.NET


Всем привет,

У меня есть несколько элементов datagridview на форму в элемент управления TabControl, каждая содержит следующие столбцы: "Реф", "Здравствуйте ЗУ ХК (аппаратный)", "Здравствуйте Менге" и "Bestandsart".

проблема в том, что "ref" содержит повторяющиеся значения, то, что я хочу сделать, это удалить все дублированные значения и суммировать соответствующие "Bestand zu KHK (HW)", "Bestand Menge" в одно целое.

Что я уже пробовал:


Dim i = t1 - 1
     Do Until i = t2
         Dim j = 0
         Do Until j = datagridviews(i).RowCount

             If Not datagridviews(i).Rows(j).Cells("ref").Value.Equals(0) Then
                 Dim s1
                 Dim s2

                 s1 = datagridviews(i).Rows(j).Cells("Bestand zu KHK (HW)").Value
                 s2 = datagridviews(i).Rows(j).Cells("Bestand Menge").Value

                 For t = j + 1 To datagridviews(i).RowCount - 1
                     If datagridviews(i).Rows(j).Cells("ref").Value.Equals(datagridviews(i).Rows(t).Cells("ref").Value) And datagridviews(i).Rows(j).Cells("Bestandsart").Value.Equals(datagridviews(i).Rows(t).Cells("Bestandsart").Value) Then
                         s1 = s1 + datagridviews(i).Rows(t).Cells("Bestand zu KHK (HW)").Value
                         s2 = s2 + datagridviews(i).Rows(t).Cells("Bestand Menge").Value

                         datagridviews(i).Rows(t).Cells("ref").Value = 0
                         datagridviews(i).Rows(t).Cells("Bestandsart").Value = 0
                         datagridviews(i).Rows(t).Cells("Bestand Menge").Value = 0
                         datagridviews(i).Rows(t).Cells("Bestand zu KHK (HW)").Value = 0

                     End If
                 Next
                 datagridviews(i).Rows(j).Cells("Bestand zu KHK (HW)").Value = s1
                 datagridviews(i).Rows(j).Cells("Bestand Menge").Value = s2




                 j = j + 1

             ElseIf datagridviews(i).Rows(j).Cells("ref").Value.Equals(0) Then
                 j = j + 1
             End If


         Loop
         BackgroundWorker1.ReportProgress((i - (t1 - 1) + 1) / (t2 - t1 + 1) * 100)
         i = i + 1
     Loop



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

в настоящее время существует 21 datagridviews, и каждый из них содержит около 1100 строк.

может кто-нибудь, пожалуйста, помочь или указать в правильном направлении.

заранее спасибо.

1 Ответов

Рейтинг:
2

RickZeeland

Вы могли бы использовать .Datasource для вашей сетки и используйте SQL-запрос с DISTINCT, пример:

string customers = "SELECT DISTINCT * FROM Customers";

using (SqlConnection con = new SqlConnection("Data Source=MY-PC;Initial Catalog=northwind;Integrated Security=True"))
{
	DataSet ds = new DataSet();
	SqlDataAdapter da = new SqlDataAdapter(customers, con);
	da.Fill(ds, "Customers");
	dataGridView.AutoGenerateColumns = true;
	dataGridView.DataSource = ds;
	dataGridView.DataMember = "Customers";
}

Также можно установить фильтр на DataSet (не обязательно должен быть запрос к базе данных).

В VB.NET:
Imports System
Imports System.Xml
Imports System.Data
Imports System.Data.SqlClient

Public Class Program
    Public Shared Sub Main()
        Dim customers As String = "SELECT DISTINCT * FROM Customers"
        Using con As SqlConnection = New SqlConnection("Data Source=MY-PC;Initial Catalog=northwind;Integrated Security=True")
            Dim ds As DataSet = New DataSet()
            Dim da As SqlDataAdapter = New SqlDataAdapter(customers, con)
            da.Fill(ds, "Customers")
	    dataGridView.AutoGenerateColumns = true
	    dataGridView.DataSource = ds
	    dataGridView.DataMember = "Customers"
        End Using
    End Sub
End Class