MaikelO1 Ответов: 3

Подсчет общего количества различимых элементов listview


У меня есть listview (Listview 1), который я заполнил данными. Теперь я хочу зарядить второй listview (listview 2) на первый listview. Это должно указывать Collem [1] listview1 и подсчитывать количество вхождений имени. См. пример listview 2.

Listview 1
ID *  NAAM  *  DATE
1 .     MO            01-01-2016
1 .     DE             01-01-2016
1 .     MO            02-01-2016
1 .     MO            02-01-2016
1 .     DE             02-01-2016
1 .     MO            03-01-2016
1 .     MO            02-01-2016


Listview 2
NAAM  *  Total count
MO    (TOTAL 5)         
DE     (TOTAL 3)


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

Я нашел это; но в этом письме нет различия в именах..

var query = listView.Items
                    .Cast<listviewitem>()
                    .Where(item => item.SubItems[3].Text == "asdf");
foreach (var item in query)
{
    ...
}

Karthik_Mahalingam

как вы связываете данные ?
опубликуйте код привязки.

MaikelO1

частный недействительный регистрационный фильтр()
{
ListBoxUren.TabIndex = 0;
ListBoxUren.Предметы.Четкий();
ListBoxUren.Вид = Вид.Детали;

ListBoxUren.Множественный = ложь;
ListBoxUren.FullRowSelect = true;

using (var connection = new SqlConnection(connectionstring))
{

var query = "SELECT ID, Start, Stop, Pauze, SoortOmschrijving, Naam, IDProjecten, Organisatie, AardOmschrijving, ExtraOmschrijving, (Projectnummer + '-' + Organisatie + '-' + Referentie) AS REFProject, (MaterieelNR + '- Materieelstuk) КАК REFMaterieel ОТ UrenREG LEFT OUTER JOIN Medewerkers ПО UrenReg.FK_IDMedewerker = Medewerkers.IDMedewerker LEFT OUTER JOIN UrenRegSoortActiviteit ПО UrenReg.FK_SoortActiviteitID = UrenRegSoortActiviteit.SoortID LEFT OUTER JOIN Projecten ПО UrenReg.FK_ProjectID = Projecten.IDProjecten LEFT OUTER JOIN Klanten ON Projecten.FK_IDKlant = Klanten.IDKlanten LEFT OUTER JOIN UrenRegAardVanActiviteit ON UrenReg.Fk_AardVanActiviteitID = UrenRegAardVanActiviteit.AardVanActiviteitID LEFT OUTER JOIN Materieel ON UrenReg.FK_materiaalID = Materieel.IDMaterieel LEFT OUTER JOIN UrenRegExtra ON UrenReg.FK_ExtraID = UrenRegExtra.ExtraID, где начинаются как @date ";

using (var adapter = new SqlDataAdapter(query, connection))
{

SqlParameter parm1 = адаптер.Команды selectcommand.Параметры.AddWithValue ("@Date", " % " + LB_DatePick.Текст + "%");

пробовать
{
DataTable ProjectLijst = новый DataTable();
адаптер.Заливка (ProjectLijst);

для (тип int я = 0; Я &л; ProjectLijst.Строк.Граф; i++)
{
Доктор строкаданных = ProjectLijst.Строки[я];
Элементы listviewitem элемент listitem = новый элемент listviewitem(д-р["Наам"].Метод toString());
listitem элемент.подпункты.Добавить (dr ["Start"].Метод toString());
listitem элемент.подпункты.Добавить (dr ["стоп"].Метод toString());
listitem элемент.подпункты.Добавить (dr ["Pauze"].Метод toString());
listitem элемент.подпункты.Добавить (dr ["AardOmschrijving"].Метод toString());
listitem элемент.подпункты.Добавить (dr ["SoortOmschrijving"].Метод toString());
listitem элемент.подпункты.Добавить (dr ["REFProject"].ToString () + dr["REFMaterieel"].Метод toString());
listitem элемент.подпункты.Добавить (dr ["ExtraOmschrijving"].Метод toString());

listitem элемент.Tag = dr ["ID"];
ListBoxUren.Предметы.Добавить (listitem);

ListBoxUren.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
ListBoxUren.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
}
}
catch (исключение)
{

Karthik_Mahalingam

вам нужен отчетливый столбец count of NAAM во втором списке?

MaikelO1

Да

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

3 Ответов

Рейтинг:
4

0x01AA

Пожалуйста, отнеситесь к этому решению не слишком серьезно, я понятия не имею об этих вещах Linq. Я также понятия не имею, правильный ли это путь. Но если я посмотрю на результат, то для меня, по крайней мере, это решит проблему.

private void buttonListViewLinq_Click(object sender, EventArgs e)
{
    // Test Source ListView
    listViewLinq.Items.Clear();
    listViewLinq.Items.Add(new ListViewItem (new string[]{"1", "A", "2016-08-01"}));
    listViewLinq.Items.Add(new ListViewItem (new string[]{"1", "A", "2016-08-02"}));
    listViewLinq.Items.Add(new ListViewItem (new string[]{"1", "B", "2016-08-03"}));
    listViewLinq.Items.Add(new ListViewItem (new string[]{"1", "B", "2016-08-04"}));
    listViewLinq.Items.Add(new ListViewItem (new string[]{"1", "B", "2016-08-05"}));
    listViewLinq.Items.Add(new ListViewItem (new string[]{"2", "B", "2016-08-06"}));
    listViewLinq.Items.Add(new ListViewItem (new string[]{"1", "C", "2016-08-07"}));

    // Get IEnumerable to go on with linq
    IEnumerable<ListViewItem> lv = listViewLinq.Items.Cast<ListViewItem>();

    // Here grouping happens
    var res = lv.GroupBy(gb => gb.SubItems[1].Text)
                .Select(group => new { groupVal = group.Key, 
                                       groupCount = group.Count() });

    // Columns of Result ListView
    listViewRes.Columns.Clear();
    listViewRes.Columns.Add("NAAM");
    listViewRes.Columns.Add("Total Count", 100);
    listViewRes.View = View.Details;

    // Add Result ListViewItems
    listViewRes.Items.AddRange(res.Select(g => new ListViewItem(new string[]
         {g.groupVal, 
          String.Format("(TOTAL {0})", g.groupCount.ToString())
         })).ToArray());
}


Примечание: по вашему примеру привести Вас заинтересовала графа и _не_ в отдельный счетчик.
Надеюсь, это поможет.


MaikelO1

Имя работает, только счетчик, или добавление счетчика к строке не работает :(

0x01AA

Я думаю, что не понимаю смысла, извините.
Или вы хотите сказать,что не видите графу Count? Если это так, установите resListView. View= Details;

0x01AA

< pre lang= "text">Для моих тестов resListView показывает:
Наам рассчитывать
---- -----
А 2
B 4
C 1< / pre>

0x01AA

См. обновление решения, которое показывает, например," (всего 5) " для столбца Count.

Maciej Los

Бруно, прости, но ты ошибаешься. Пожалуйста, прочтите мой ответ, чтобы узнать почему...

0x01AA

Привет, Мацей, никаких проблем. Вот почему я предупредил ОП в самом начале. Но решение работает, и ОП попросил в Q сделать это с помощью ListViews. Для меня это была отличная выдержка с этим linq-материалом, я не беспокоился об источнике данных :)

Maciej Los

Бруно, конечно, ваше решение тоже работает, но мы должны иметь в виду, что мы должны работать с данными, а не с элементами управления. Да, Linq-это мощный инструмент! Мне это очень нравится, потому что Linq-запросы очень похожи на SQL-запросы.
Твое Здоровье, Мацей.

Рейтинг:
27

Maciej Los

Майкело1[^] написал в комментарии:
private void Registratiefilter()
        {
            ListBoxUren.TabIndex = 0;
            ListBoxUren.Items.Clear();
            ListBoxUren.View = View.Details;

            ListBoxUren.MultiSelect = false;
            ListBoxUren.FullRowSelect = true;

            using (var connection = new SqlConnection(connectionstring))
            {

                var query = "SELECT ID, Start, Stop, Pauze, SoortOmschrijving, Naam, IDProjecten, Organisatie, AardOmschrijving, ExtraOmschrijving, (Projectnummer + ' - ' + Organisatie +  ' - ' + Referentie) AS REFProject, (MaterieelNR + ' - ' + Materieelstuk) AS REFMaterieel  FROM UrenREG LEFT OUTER JOIN Medewerkers ON UrenReg.FK_IDMedewerker = Medewerkers.IDMedewerker LEFT OUTER JOIN UrenRegSoortActiviteit ON UrenReg.FK_SoortActiviteitID = UrenRegSoortActiviteit.SoortID LEFT OUTER JOIN Projecten ON UrenReg.FK_ProjectID = Projecten.IDProjecten LEFT OUTER JOIN Klanten ON Projecten.FK_IDKlant = Klanten.IDKlanten LEFT OUTER JOIN UrenRegAardVanActiviteit ON UrenReg.Fk_AardVanActiviteitID = UrenRegAardVanActiviteit.AardVanActiviteitID LEFT OUTER JOIN Materieel ON UrenReg.FK_materiaalID = Materieel.IDMaterieel LEFT OUTER JOIN UrenRegExtra ON UrenReg.FK_ExtraID = UrenRegExtra.ExtraID WHERE Start like @Date";
                
                using (var adapter = new SqlDataAdapter(query, connection))
                {

                    SqlParameter parm1 = adapter.SelectCommand.Parameters.AddWithValue("@Date", "%" + LB_DatePick.Text + "%");

                    try
                    {
                        DataTable ProjectLijst = new DataTable();
                        adapter.Fill(ProjectLijst);

                        for (int i = 0; i < ProjectLijst.Rows.Count; i++)
                        {
                            DataRow dr = ProjectLijst.Rows[i];
                            ListViewItem listitem = new ListViewItem(dr["Naam"].ToString());
                            listitem.SubItems.Add(dr["Start"].ToString());
                            listitem.SubItems.Add(dr["Stop"].ToString());
                            listitem.SubItems.Add(dr["Pauze"].ToString());
                            listitem.SubItems.Add(dr["AardOmschrijving"].ToString());
                            listitem.SubItems.Add(dr["SoortOmschrijving"].ToString());
                            listitem.SubItems.Add(dr["REFProject"].ToString() + dr["REFMaterieel"].ToString());
                            listitem.SubItems.Add(dr["ExtraOmschrijving"].ToString());

                            listitem.Tag = dr["ID"];
                            ListBoxUren.Items.Add(listitem);

                            ListBoxUren.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
                            ListBoxUren.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
                        }
                    }
                    catch (Exception)
                    {


Во-первых, во-вторых и, наконец,: Вы должны работать с данными, а не с элементами управления!

Что касается вашей путаницы о том, как получить отчетливый подсчет некоторых данных:
У вас есть 2 способа добиться этого:
1) Вы можете "спросить" свою базу данных и вернуть результат во второй ListView
2) Вы можете получить количество различных значений, группируя данные из datatable с помощью Linq

Объявление 1)
SELECT Name, COUNT(DISTINCT Name)
FROM YourTable
GROUP BY Name


Объявление 2)
var result = ProjectLijs.AsEnumerable()
    .GroupBy(x => x.Field<string>("Name"))
    .Select(grp => new
          {
              Name = grp.Key,
              Count = grp.Distinct().Count()
          })
     .ToList()


Все, что вам нужно сделать прямо сейчас, - это привязать эти данные ко второму ListView.

Попробуйте тот метод, который вы предпочитаете! Обратите внимание, что решение Linq для большого объема данных может вызвать проблемы с эффективностью.

Для получения более подробной информации, пожалуйста, смотрите:
LINQ to DataSet[^]
Примеры LINQ to DataSet[^]
Запросы в LINQ to DataSet[^]
Запрос наборов данных (LINQ to DataSet)[^]
101 образцы LINQ в C#[^]

[РЕДАКТИРОВАТЬ]
Пример:

DataTable dt = new DataTable();

dt.Columns.Add(new DataColumn("ID", typeof(int)));
dt.Columns.Add(new DataColumn("Name", typeof(string)));
dt.Columns.Add(new DataColumn("Date", typeof(DateTime)));

dt.Rows.Add(new object[]{1, "MO", new DateTime(2016,1,1)});
dt.Rows.Add(new object[]{1, "DE", new DateTime(2016,1,1)});
dt.Rows.Add(new object[]{1, "MO", new DateTime(2016,1,2)});
dt.Rows.Add(new object[]{1, "MO", new DateTime(2016,1,2)});
dt.Rows.Add(new object[]{1, "DE", new DateTime(2016,1,2)});
dt.Rows.Add(new object[]{1, "MO", new DateTime(2016,1,3)});
dt.Rows.Add(new object[]{1, "MO", new DateTime(2016,1,2)});

var result = dt.AsEnumerable()
		.GroupBy(x=>x.Field<string>("Name"))
		.Select(grp=>new
			{
				Name = grp.Key,
				Count = grp.Distinct().Count()
			});


Выше код возвращает:
MO 5 
DE 2 


[/РЕДАКТИРОВАТЬ]


Karthik_Mahalingam

5 для объяснения

Maciej Los

Спасибо, Картик.

Animesh Datta

Мои 5

Maciej Los

Спасибо.

0x01AA

5 за это.

Maciej Los

- Спасибо, Бруно.

CPallini

5.

Maciej Los

Спасибо, Карло.

MaikelO1

спасибо за ваш ответ! Я собираюсь углубиться в это решение

Maciej Los

Всегда пожалуйста.

Рейтинг:
1

Karthik_Mahalingam

см. этот пример

private void Form3_Load(object sender, EventArgs e)
       {
           listView1.View = View.Details;
           listView1.GridLines = true;


           ListViewItem item1 = new ListViewItem("1");
           item1.SubItems.Add("MO");
           item1.SubItems.Add("01-01-2016");
           ListViewItem item2 = new ListViewItem("1");
           item2.SubItems.Add("DE");
           item2.SubItems.Add("01-01-2016");
           ListViewItem item3 = new ListViewItem("1");
           item3.SubItems.Add("MO");
           item3.SubItems.Add("01-01-2016");
           ListViewItem item4 = new ListViewItem("1");
           item4.SubItems.Add("MO");
           item4.SubItems.Add("01-01-2016");
           ListViewItem item5 = new ListViewItem("1");
           item5.SubItems.Add("DE");
           item5.SubItems.Add("01-01-2016");
           ListViewItem item6 = new ListViewItem("1");
           item6.SubItems.Add("MO");
           item6.SubItems.Add("01-01-2016");
           ListViewItem item7 = new ListViewItem("1");
           item7.SubItems.Add("MO");
           item7.SubItems.Add("01-01-2016");


           listView1.Columns.Add("ID"  );
           listView1.Columns.Add("NAAM");
           listView1.Columns.Add("DATE" );

           listView1.Items.AddRange(new ListViewItem[] { item1, item2, item3, item4,item5,item6,item7 });

           int columnToCheckIndex = 1; // set the index value of the column to be checked
          List<string> lst = new List<string> ();
           foreach (ListViewItem item in listView1.Items)
               lst.Add(item.SubItems[columnToCheckIndex].Text);
           var data = lst.GroupBy(k => k).Select(k => new { key = k.Key, count = k.Count() }).ToList();
           foreach (var item in data)
           {
               ListViewItem lvi = new ListViewItem(item.key);
               lvi.SubItems.Add(item.count.ToString());
               listView2.Items.Add(lvi);

           }

           listView2.Columns.Add("NAAM");
           listView2.Columns.Add("Total Count");
           listView2.View = View.Details;
           listView2.GridLines = true;





       }


0x01AA

А 5, особенно для введения int columnToCheckIndex = 1; чтобы сделать техническое обслуживание более легким.

Karthik_Mahalingam

Спасибо 0x01AA

Maciej Los

Картик, прости, но ты ошибаешься. Пожалуйста, прочтите мой ответ, чтобы узнать почему...

Karthik_Mahalingam

Привет Мацей
Разница, которую я обнаружил, заключалась в том, что я выбираю данные из существующего списка, в то время как вы получаете их из источника данных.
по этой причине только я спросил ОП в первую очередь " как вы связываете данные ?
опубликуйте код привязки.

но он опубликовал какой-то дамп кода, который не имеет большого отношения к заданному им вопросу, поэтому я просто продемонстрировал ему какой-то фрагмент кода..
Этот подход может быть неправильным, но он работает правильно Мацей :)
Однако ваше решение содержит подробную информацию, в которой нуждается ОП или кто-либо еще в будущем.

Спасибо
Картик

Maciej Los

Что ж... Я должен извиниться, потому что был недостаточно ясен. Когда я сказал, что вы ошибаетесь, я подумал о "контексте данных", я не сказал, что ваше решение неверно. Это правильно, но мы должны иметь в виду, что мы должны работать с данными, а не с контролем. Вот почему я голосовал произвольно (3).
Овации,
Мацей

Karthik_Mahalingam

крутой :)