ListView idealnie nadaje się pod względem struktury, ale są problemy z dodaniem obiektów, np. progressbar czy obrazek w jednej z komórek wiersza.
Zrobiłem to, jeśli chodzi o progressBar, ale kod mi się nie podoba. Gdy dorzucę jeszcze obrazek, który trzeba "powiesić" na pictureBox to wszystko może się posypać przy kilkudziesięciu rekordach. Za dużo obiektów, zbyt skomplikowane działanie, przynajmniej takie mam wrażenie.
Tu jest kod z dorzucenia progressbara i podpięcia go pod konkretny wiersz i kolumnę (dokładniej komórkę), działa włącznie z resize kolumny.
KOD cpp: UKRYJ
//obiekt progressBar jako global (poza eventami)
static ProgressBar ^ pg = gcnew ProgressBar();
//tu mamy aktywację progressbarów w pełnym działaniu (to oczywiście prototyp, składanie na szybko by sprawdzić tylko jak i czy działa)
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
this->listView1->Controls->Add(pg);
pg->Style = System::Windows::Forms::ProgressBarStyle::Continuous;
System::Drawing::Rectangle ^ aa = System::Drawing::Rectangle(listView1->Items[1]->GetBounds(System::Windows::Forms::ItemBoundsPortion::Label));
System::Drawing::Size ^ aaa = System::Drawing::Size(listView1->Items[1]->SubItems[1]->Bounds.X, listView1->Items[1]->SubItems[1]->Bounds.Y);
pg->Size = System::Drawing::Size(listView1->Items[1]->SubItems[1]->Bounds.Width, aa->Height);
pg->Location = System::Drawing::Point(aaa);
pg->Refresh();
}
//podobne jest w zdarzeniu "listView1_ColumnWidthChanging" więc nie będę wklejał
static ProgressBar ^ pg = gcnew ProgressBar();
//tu mamy aktywację progressbarów w pełnym działaniu (to oczywiście prototyp, składanie na szybko by sprawdzić tylko jak i czy działa)
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
this->listView1->Controls->Add(pg);
pg->Style = System::Windows::Forms::ProgressBarStyle::Continuous;
System::Drawing::Rectangle ^ aa = System::Drawing::Rectangle(listView1->Items[1]->GetBounds(System::Windows::Forms::ItemBoundsPortion::Label));
System::Drawing::Size ^ aaa = System::Drawing::Size(listView1->Items[1]->SubItems[1]->Bounds.X, listView1->Items[1]->SubItems[1]->Bounds.Y);
pg->Size = System::Drawing::Size(listView1->Items[1]->SubItems[1]->Bounds.Width, aa->Height);
pg->Location = System::Drawing::Point(aaa);
pg->Refresh();
}
//podobne jest w zdarzeniu "listView1_ColumnWidthChanging" więc nie będę wklejał
Całość widać na screenie :
Podobnie tyczy się obrazka, tzn. tak miałem zamiar zrobić, ale jak mówiłem całość mi się niespecjalnie podoba.
Ma ktoś może jakieś lepsze rozwiązanie ? :/
Liczba elementów nie powinna przekroczyć 100-120, więc pod to trzeba dopasowywać wydajność.
Gdzieś szukałem w google, to ktoś zrobił na 37k elementów to mu się ładowało 2-3 min, dlatego tak informuję ; p
---
Jeszcze mam takie inne pytanie, nie dotyczące listView. Zauważyłem pewien fajny efekt w programie, wiem że był pisany w Visualu, ale za cholerę nie mogę znaleźć tego komponentu, a na 99 % należy on do standardowych (jak, np. listview). To jest coś w stylu takich rozwijanych menu, jeden pod drugim, z tym że jak rozwiniesz to komponenty niższe się przesuwają w dół (tutaj na 100 % flowLayoutPanel). Klikasz na nagłówke i rozwija się lista, coś jak comboBox, tylko, że jego opcje są nakładane na inne komponenty. Nie wiem czy wystarczająco jasno opisuje ;p Bardzo elegancko to wygląda, więc chciałem to wrzucić u siebie. Można by dodać coś w stylu buttonów kolejno jeden pod drugim, a kliknięcie na główny (reprezentujący nagłówek) wywołuje Hide() u innych należących do tej grupy, jednak to nie to samo. Może ktoś wie co to za komponent i jak skonfigurowany ? Ktoś stosował to u siebie...