Member 11920272 Ответов: 1

Как добавить несколько строк в одну ячейку в listview из базы данных в C#?


У меня есть проблема с добавлением значений в listview из dadabase, есть связь с парой таблиц, и вот все в порядке.
В моем случае у меня есть таблица с X строками с одинаковыми значениями
PrID|koID
1   |5
1   |8
20  |3
6   |80
13  |3
6   |41
например, для PrID=1 я должен получить строки для koID 5 и 8 в одной ячейке
но когда я добавляю это, строки из KoID 5 находятся в одной строке в listView, koId 8-в другой
column1|column2|column3
1      |A      |Item1
1      |B      |Item1
1      |...    |Item1
2      |C      |Item2
3      |B      |Item3
3      |E      |Item3
3      |...    |Item3

должно быть вот так
column1|column2|column3
1      |AB...  |Item1
2      |C      |Item2
3      |BE...  |Item3


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

foreach (DataRow row in dt.Rows)
{
string str = row["kon"].ToString()+" "+row["kov"].ToString();

ListViewItem list = new ListViewItem(row["Id"].ToString());
               list.SubItems.Add(str);
               list.SubItems.Add(row["item"].ToString());
               listView1.Items.Add(list);
}

1 Ответов

Рейтинг:
1

Maciej Los

Вам нужно сгруппировать данные по PrID Есть несколько способов достичь этого. Одним из самых простых является использование объекта Dictionary.

Взгляните на приведенный ниже пример:

//sample data 
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]{new DataColumn("PrID", typeof(int)), new DataColumn("koID", typeof(int))});
dt.Rows.Add(new object[]{1, 5});
dt.Rows.Add(new object[]{1, 8});
dt.Rows.Add(new object[]{20, 3});
dt.Rows.Add(new object[]{6, 80});
dt.Rows.Add(new object[]{13, 3});
dt.Rows.Add(new object[]{6, 41});

//create dictionary object
Dictionary<int, List<int>> d = new Dictionary<int, List<int>>();
//loop through the collection of datatable's rows
foreach(DataRow dr in dt.Rows)
{
	//if key does NOT exist
	if(!d.ContainsKey(dr.Field<int>("PrID")))
		d.Add(dr.Field<int>("PrID"), new List<int>(){dr.Field<int>("koID")});
	else
		d[dr.Field<int>("PrID")].Add(dr.Field<int>("koID"));
}
//add listviewitem and its subitems based on dictionary object
foreach(int k in d.Keys)
{
	ListViewItem lvi = new ListViewItem(k.ToString());
	foreach(int v in d[k])
		lvi.SubItems.Add(v.ToString());
	ListView1.Items.Add(lvi);
}


Другие решения должны быть основаны на Linq.


Member 11920272

Извините я опоздал

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

поэтому я нахожу решение своей проблемы с sql-запросом STRING_AGG()