[C#] GUI (winform) vyhledávání a filtrování v tabulce.

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Nargon 9. 5. 2012 11:41

Ahoy, mám tabulku, která obsahuje hodně (cca 20) textových sloupců. A řeším problém, jak umožnit uživatelům vyhledávat a filtrovat zobrazené řádky v tabulce. Představa je asi taková, že by nad (nebo pod) každým sloupcem bylo okno, kam uživatel něco napíše a v tabulce se zobrazí jen řádky, které tento text obsahují. Samozřejmě to musí umět filtrovat podle několika sloupců současně s logickou AND spojkou.

S tím filtrováním problém nemám, to mi programove funguje dobře. Ale nevím jak "zobrazit" ty vyhledávací "textboxy" nad každým sloupcem té tabulky.
Tabulku zobrazuji přes Datagridview, a samozřejmě že tabulka je velká tak tu jsou posuvníky (nahoru/dolu a vlevo/vpravo) a dávat na formulář 20 textboxů a posunovat jimi podle toho jak se posune posuvník u tabulky. A taky jim nastavovat šířku podle šířky sloupce v tabulce, tak to mi nepřijde jako dobré řešení.
Takže jak řešit tohle zobrazení vyhledávacích textboxů? Třeba mě napadlo vyhradit první řádek tabulky pro ty vyhledávací pole, ale nevím jak ten řádek "ukotvit" (podobně jako to umí excel) u hlavičky tabulky, aby nezmizel, když posuvníkem odjedu na další řádky.
Nebo mám použít nějakou komponentu? kterou? a jak?
Zatím jsem dělal jen ve Winform, myslíte že ve WPF by se to dalo zařídit nějak lépe?
Desktop: E8400@3.645GHz, Asus P5Q-E, 4GB Ram, 1440GB HDD, Ati HD4850
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Pokročilý

Odeslat příspěvekod KačerT 9. 5. 2012 18:05

Ahoj,
já jsem tohle vyřešil tak, že jsem si udělal splitcontainer. Do horního panelu jsem dal datagridview se stejným počtem sloupců. Má dva řádky, kdy v prvním řádku mám comboboxcel s výčtem "operandů" a ve druhém řádku je textboxcell, do které právě dávají hodnoty pro filtr. A do spodního panelu jsem dal právě to datagridview, které zobrazuje hodnoty.
Samozřejmě jsem si musel pohrát s událostí columnwidthchanged a sorted. V tom spodním dgv jsem skryl columnheader a vše se řídí tím horním.
V příloze posílám náhled.
Když bude ale mít někdo lepší řešení, rád se poučím. Protože já bych to potřeboval jako jednu komponentu, protože bych to využíval i v jiných aplikacích a takhle si to musím vždy vytvářet.

Dgv.JPG
KačerT
Junior

Odeslat příspěvekod Nargon 9. 5. 2012 18:43

Jo diky za tip jak na to, ale já právě taky hledám něco víc programer friendly. Sám si říkám že požadavek na tabulku s vyhledáváním nad každým sloupcem je celkem normální a divím se, že to už někdo nevyrobil jako komponentu.
Desktop: E8400@3.645GHz, Asus P5Q-E, 4GB Ram, 1440GB HDD, Ati HD4850
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Pokročilý


Odeslat příspěvekod chatumbabub 9. 5. 2012 18:59

jestli ti nevadi placena kompeneta, tak s DevExpress mam velmi dobre zkusenosti. Umi toho spoustu, vcetne toho co potrebujes.
Přílohy
devExpress.PNG
i7 2600K, ASUS P8Z77-V DELUXE, Radeon 7850, Intel 320 + Dell U2412M, LG IPS235P
Nokia Lumia 920
chatumbabub
Junior
Uživatelský avatar

Odeslat příspěvekod vesi 18. 5. 2012 14:56

Já jsem to vyřešil docela jednoduchým kódem. Vyhledává to ve všech buňkách a není potřeba dělat fill ;) Samozřejmě si to můžeš přizpůsobit třeba tak, že budeš mít jedno vyhledávací pole a k tomu combo s volbou sloupce, kde chceš vyhledávat. Úprava mého kódu je pak už triviální. Není to úplně přesně jak jsi to chtěl, ale snad to bude pro tebe použitelné.
Kód: Vybrat vše
private void search()
        {
            string search_text = this.toolStripTextBox_search.Text.ToLower();
            this.dataGridView.CurrentCell = null;
            for (int dr = 0; dr <= Convert.ToInt32(this.dataGridView.Rows.Count - 1); dr++)
            {
                for (int dc = 0; dc <= Convert.ToInt32(this.dataGridView.Columns.Count - 1); dc++)
                {
                    if (this.dataGridView.Rows[dr].Cells[dc].Value.ToString().ToLower().Contains(search_text))
                    {
                        if (!this.dataGridView.Rows[dr].Visible)
                        {
                            this.dataGridView.Rows[dr].Visible = true;
                            break;
                        }
                        else
                        { break; }
                    }
                    else
                    {
                        if (this.dataGridView.Rows[dr].Visible)
                        { this.dataGridView.Rows[dr].Visible = false; }
                    }
                }
            }
        }
vesi
Kolemjdoucí


Kdo je online

Uživatelé procházející toto fórum: marts, PiranhaGreg a 7 návštevníků