Diskuze: Vyhledávání v dataGrid

C# .NET .NET (C# a Visual Basic) Vyhledávání v dataGrid American English version English version

Avatar
Maros2470
Člen
Avatar
Maros2470:

Mám 2x textBox (kod, banka). Do data grid mám načtená data (kodBanky, jmenoBanky). Potřebuji po vypisování např. banky po znacích do textBoxu, aby mi dataGrid označil řádek v gridu. Data mám řazena abecedně. Takže, když mám v gridu např, Česká spořitelna a ČSOB, tak při vypsání "Č" do text boxu mi označí první řádek s položkou začínající na "Č". Při zadání "Če" mi označí první řádek s položkou začínající na "Če" a tak dále. Nevím jak v gridu vyhledávat.

 
Odpovědět 10.5.2014 18:55
Avatar
Gramli
Redaktor
Avatar
Odpovídá na Maros2470
Gramli:

Textbox má event -> textChanged, takže když se změní text v TextBoxu zavolá se tato metoda. V této metodě si napíšeš kód například:

private void textBox1_TextChanged(object sender, EventArgs e)
        {
            for (int i = 0; i < dataGridView1.Rows.Count; i++)// projizdim dataGrid
            {
                string hodnota = dataGridView1.Rows[i].Cells[indexBunkykterouChces].Value; // davam si hodnotu bunky do stringu

                if (hodnota.Contains(textBox1.Text)) // jeslize ten string obsahuje text z Textboxu
                    dataGridView1.Rows[i].Selected = true; // oznacim radek
            }
        }
Nahoru Odpovědět 10.5.2014 20:17
Kdo to říká ten to je...
Avatar
rwn
Člen
Avatar
Odpovídá na Maros2470
rwn:

V podsatatěsi bys to mohl udělat jednoduše přes cyklus, kde projedeš všechny řádky.

for (int i = 0; i < dataGridView.Rows.Count; i++)
{
    if (dataGridView.Rows[i].Cells[0].Value.StartsWith("Č")) //Pokud položka začíná na "Č"..//to Cells[0] říká, že se jedná o první sloupeček..
    {
        // i bude číslo řádku začínající na Č
        // kdyžtak tam stačí přidate break; jinak v i bude poslední řádek začínající na Č
    }
}
Nahoru Odpovědět 10.5.2014 20:18
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Maros2470
Člen
Avatar
Odpovídá na Gramli
Maros2470:

Mám to takto, ale je tam chyba:
Cannot implicitly convert type 'object' to 'string'. An explicit conversion exists (are you missing a cast?)

private void bankaTextBox_Tex­tChanged(object sender, EventArgs e)

{

for (int i = 0; i < dataGridView1­.Rows.Count; i++)// projizdim dataGrid
{
string banka = dataGridView1­.Rows[i].Cells[1]­.Value; // davam si hodnotu bunky do stringu

if (banka.Contain­s(bankaTextBox­.Text)) // jeslize ten string obsahuje text z Textboxu
dataGridView1­.Rows[i].Selec­ted = true; // oznacim radek
}

}

Editováno 10.5.2014 20:37
 
Nahoru Odpovědět 10.5.2014 20:36
Avatar
rwn
Člen
Avatar
Odpovídá na Maros2470
rwn:

No jasně, musíš mu říct, že chceš zapsat do proměnné banka string

string banka = dataGridView1.Rows[i].Cells[1].Value.ToString()

A mimochodem si tenhle řádek dej až do té podmínky if, jinak si budeš přepisovat proměnnou s každým cyklem.

Editováno 10.5.2014 20:52
Nahoru Odpovědět 10.5.2014 20:49
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Maros2470
Člen
Avatar
Odpovídá na rwn
Maros2470:

To jsem taky zkoušel, ale po zadání do textBox aplikace spadne a zobrazí chybu: Object reference not set to an instance of an object.

 
Nahoru Odpovědět 10.5.2014 21:02
Avatar
rwn
Člen
Avatar
Odpovídá na Maros2470
rwn:

Na jakém řádku ti to padá?

Nahoru Odpovědět 10.5.2014 21:03
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Maros2470
Člen
Avatar
Odpovídá na rwn
Maros2470:

banka = dataGridView1­.Rows[i].Cells[1]­.Value.ToStrin­g();

 
Nahoru Odpovědět 10.5.2014 21:05
Avatar
rwn
Člen
Avatar
Odpovídá na Maros2470
rwn:

Už vím čím to je. Problém je v tom, že ty máš v tom svém dataGridu spodní řádek, kterým můžeš přidávat další řádky. Program pak spadne když se k němu dostane, protože na tu prázdnou hodnotu nedokáže použít ToString(). Takže buď můžeš řádek na přidávání zrušit, nebo nebudeš projíždět všechny řádky (u Rows.Count dát -1) a nebo úplně nejlepší ten převod nedělat metodou ToString(), ale convertovat to na string:

private void bankaTextBox_TextChanged(object sender, EventArgs e)
{
    for (int i = 0; i < dataGridView1.Rows.Count; i++)
    {
        if (Convert.ToString(dataGridView1.Rows[i].Cells[0].Value) == bankaTextBox.Text)
        {
            dataGridView1.Rows[i].Selected = true;
        }
    }
}

Teda přesněji u toho tvého udělat podmínku (pokud hledáš i část textu):

if (Convert.ToString(dataGridView1.Rows[i].Cells[0].Value).Contains(bankaTextBox.Text))
Editováno 10.5.2014 21:28
Nahoru Odpovědět 10.5.2014 21:25
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Maros2470
Člen
Avatar
Odpovídá na rwn
Maros2470:

Mám ještě jeden dotaz. Po spuštění aplikace a načtení dat se mi v gridu označí první řádek a při vyhledání dat zůstane označen. Zkoušel jsem: dataGridView1­.Rows[1].Selec­ted = false;, ale to nefunguje

 
Nahoru Odpovědět 10.5.2014 21:58
Avatar
Maros2470
Člen
Avatar
Maros2470:

Už je to OK. Díky za rady

 
Nahoru Odpovědět 10.5.2014 22:06
Avatar
rwn
Člen
Avatar
Odpovídá na Maros2470
rwn:

V pohodě, jinak tyhle věci včetně barev vybrané položky, barva textu vybrané položky atd. se dají nastavit v Properties toho dataGridu, chce to jen se trochu proklikat. :)

Nahoru Odpovědět  +1 10.5.2014 22:27
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Maros2470
Člen
Avatar
Odpovídá na rwn
Maros2470:

Ještě bych potřeboval poradit jak vyřešit navigační tlačítka v gridu (první, poslední, následný, předchozí řádek), asi by to šlo odvodit od čísla právě vybraného řádku, ale nevím jak jeje získat.

 
Nahoru Odpovědět 11.5.2014 11:15
Avatar
rwn
Člen
Avatar
Odpovídá na Maros2470
rwn:

To nevím moc jak myslíš navigační tlačítka, nebo spíš coby to přesně dělalo. :) Pomocí souřadnic ve smyslu řádek, buňka můžeš brát a přepisovat libovolnou buňku v gridu. Jinak první řádek máš v podstatě .Rows[0], poslední: .Rowrs[dataGrid­.Rows.Count], předposlední: .Rowrs[dataGrid­.Rows.Count-1]. Samozřejmě ale dost záleží co přesně s tím chceš dělat.

Nahoru Odpovědět 11.5.2014 14:00
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Maros2470
Člen
Avatar
Odpovídá na rwn
Maros2470:

Jde jen o listování v tabulce, select první, poslední řádek a předchozí a následný řádek od již vybraného vybraného řádku

 
Nahoru Odpovědět 11.5.2014 14:26
Avatar
rwn
Člen
Avatar
Odpovídá na Maros2470
rwn:

Nemyslíš spíš buňku než řádek? :)

Nahoru Odpovědět 11.5.2014 14:41
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Maros2470
Člen
Avatar
Odpovídá na rwn
Maros2470:

Mělo by to selektovat buňky v celém řádku. První a poslední by mělo být v pohodě,
první: dataGridView1­.Rows[0].Selec­ted = true;
poslední: nevím jak to napsat.
Předchozí: tam bych potřeboval získat "int číslo řádku", který má "selected = true" a od toho odečíst 1
následný: stejně jako předchozí, jen přičíst 1

 
Nahoru Odpovědět 11.5.2014 14:51
Avatar
Maros2470
Člen
Avatar
Odpovídá na rwn
Maros2470:

V Delphi byla přímo sada navigačních tlačítek, které se spojily s tabulkou a bylo to hotové

 
Nahoru Odpovědět 11.5.2014 14:59
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

To je tady taky, jmenuje se to BindingNavigator. Jen záleží na tom, jak dostáváš do DGV ty data. Pokud sis přetáhl ten datagridview ze zdroje dat (v designeru), tak bys to tam měl mít...

Nahoru Odpovědět 11.5.2014 15:06
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
rwn
Člen
Avatar
Odpovídá na Maros2470
rwn:

Tak v podstatě index posledního řádku odpovídá číslu řádků tabulky:

dataGridView1.Rows.Count

Jinak číslo řádku, který je "vyselectován" se dá získat takto:

int cislo = dataGridView.CurrentRow.Index;

Což můžeš následně použít jako index +-1

Editováno 11.5.2014 15:13
Nahoru Odpovědět 11.5.2014 15:12
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Maros2470
Člen
Avatar
Odpovídá na rwn
Maros2470:

Já to načítám přímo z tabulky databáze (SELECT * FROM Banky).
Ideální by bylo kdyby šel BindingNavigator spojit přímo s gridem.

Editováno 11.5.2014 16:26
 
Nahoru Odpovědět 11.5.2014 16:25
Avatar
rwn
Člen
Avatar
Odpovídá na Maros2470
rwn:

Tak to by čistě teoreticky neměl být až takový problém. Jde v podstatě jen o tlačítka. V podstatě by to mohlo být v tomto duchu, například o posunutí o jedno:

int novaOznacenaPOlozka = dataGridView1.CurrentRow.Index + 1;

dataGridView1.Rows[dataGridView1.CurrentRow.Index].Selected = false;
dataGridView1.Rows[novaOznacenaPOlozka].Selected = true;

Tohle má ovšem jeden základná nedostatek a to, že se ve skutečnosti k posunutí nedojde, to posunutí je jen vizuální. Ve WPF je na speciální vlastnost dataGridu, kde se manipuluje s Itemy, ale v běžném WF mě nenapadá jak se to dělá. 8|

Nahoru Odpovědět 11.5.2014 17:27
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Odpovídá na Maros2470
Michal Štěpánek:

Když si v designeru přidáš (ze zdroje dat přetažením tabulky na form) DataGridView, tak se ti tam automaticky vytvoří i BindingNavigator, který je propojený s tím DGV... 8-)

Nahoru Odpovědět 12.5.2014 10:26
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 23 zpráv z 23.