Abuamer Ответов: 3

Как сумму повторяющихся строк в datgridview и показать в другом элементе управления datagridview


у меня двух элементов datagridview(первый из них называется Dgv_Invoice,а 2-ой называется dgv_costCenter)
данные во втором datagridview(dgv_costCenter) были
item name	price	quantity	value	customerid
keyboard	20	10		 200        1
mouse	        10	10	         100        2  
monitor	        200     2                400        3
keyboard	20      5                100        4
mouse	        10      5                50         5 
keyboard	20      7                140        6
mouse	        10      7                70         7
то, что я хочу сделать, это показать элементы в первом datagridview(Dgv_Invoice) таким образом
item name	price	quantity	value	
keyboard	20	22		 440       
mouse	        10	22	         220          
monitor	        200     2                400


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

я должен создать таблицу в моей базе данных называется (items_transactions)
и чтобы решить эту проблему я сделал запрос на сохранение данных из dgv_costCenter
с помощью хранимой процедуры, а затем я вызываю данные для отображения внутри Dgv_Invoice, сгруппированные по itemname
выберите Наименование,Цена,Сумма(количество)как totalquantity из группы items_transactions по наименование,цена,количество . проблема в том, что я хочу сделать это внутри своей формы без сохранения (dgv_costCenter) в базу данных и снова вызвать данные, чтобы показать внутри(Dgv_Invoice) с запросом .. может ли кто-нибудь мне помочь.

3 Ответов

Рейтинг:
2

Graeme_Grant

Я не совсем уверен, говорите ли вы о WinForm, WPF или ASP.NET/MVC... Ответ на первые два вопроса-привязка данных. Тогда вам не нужно беспокоиться об элементе управления и о том, как получить доступ к данным, а вместо этого работать непосредственно с данными независимо от элемента управления.

* Для Winforms вот с чего нужно начать: Привязка Данных Windows Forms | Microsoft Docs[^]
* для WPF: Привязка данных (WPF) | Microsoft Docs[^]


RickZeeland

Привязка данных была бы рекомендуемым способом, но ОП говорит, что он ищет способ сделать это без сохранения в базе данных ...
Как он упоминает DataGridView, это, вероятно, приложение Winforms.

Graeme_Grant

Зависит от того, использует ли он таблицу данных, связанную непосредственно с БД или разделенные слои... Совершенно непонятно...

Abuamer

во-первых ... спасибо вам всем, ребята. правда, спасибо. но я попробовал какой - то способ, которым хочу поделиться с вами.я использовал кнопку и сделал это>>>
частная barbtnNew_ItemClick недействительным(объект отправителя, частое.XtraBars.ItemClickEventArgs е)
{
int sum=0;
for(int i=0;i<Dgv_Invoice.Rows.Граф-1;i++)
{
ВАР браслет=Dgv_Invoice.Строки[i].Ячейки[0].Значение.Метод toString();
for(int k=0;k<dgv_CostCenter.Rows.Количество-1;k++)
{
ВАР полосы 2 = dgv_CostCenter.Строки[k].Ячейки[0].Значение.Метод toString();
если(band==band2)
{
сумма+=конвертация.ToInt32(dgv_CostCenter.Строки[k].Ячейки[2].Значение);
Dgv_Invoice.Строки[i].Ячейки[2].Значение=сумма;
}
}
}
}

но это работает только для первого ряда >
не могли бы вы мне помочь пожалуйста

Рейтинг:
0

RickZeeland

Может быть, эта статья CodeProject поможет вам начать работу: OutlookGrid: группировка и упорядочивание элементов в стиле Outlook[^]

Вы также можете скопировать данные во временную папку. Список<> а потом использовать В LINQ чтобы сгруппировать и суммировать данные, пример здесь: c# - Linq: GroupBy, Sum and Count - переполнение стека[^]
В список<>, который может быть использован в качестве Источник данных для вашего DataGridView смотрите пример здесь: c# - использование списка в качестве источника данных для DataGridView - переполнение стека[^]


Abuamer

во-первых ... спасибо вам всем, ребята. правда, спасибо. но я попробовал какой - то способ, которым хочу поделиться с вами.я использовал кнопку и сделал это>>>
частная barbtnNew_ItemClick недействительным(объект отправителя, частое.XtraBars.ItemClickEventArgs е)
{
int sum=0;
for(int i=0;i<Dgv_Invoice.Rows.Граф-1;i++)
{
ВАР браслет=Dgv_Invoice.Строки[i].Ячейки[0].Значение.Метод toString();
for(int k=0;k<dgv_CostCenter.Rows.Количество-1;k++)
{
ВАР полосы 2 = dgv_CostCenter.Строки[k].Ячейки[0].Значение.Метод toString();
если(band==band2)
{
сумма+=конвертация.ToInt32(dgv_CostCenter.Строки[k].Ячейки[2].Значение);
Dgv_Invoice.Строки[i].Ячейки[2].Значение=сумма;
}
}
}
}

но это работает только для первого ряда >
не могли бы вы мне помочь пожалуйста

Рейтинг:
0

RickZeeland

В ответ на ваш вопрос сделать это можно по другому:

for (int c = 0; c < dgv_CostCenter.Rows.Count - 1; c++)
{
    int sum = 0;
    var costname = dgv_CostCenter.Rows[c].Cells[0].Value.ToString();

    for (int i = 0; i < Dgv_Invoice.Rows.Count - 1; i++)
    {
        var invoicename = Dgv_Invoice.Rows[i].Cells[0].Value.ToString();

        if (costname == invoicename)
        {
            int invoiceValue = Convert.ToInt32(Dgv_Invoice.Rows[i].Cells[2].Value);
            sum += invoiceValue;
            dgv_CostCenter.Rows[c].Cells[2].Value = sum;
        }
    }
}