IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Maros2470
Člen
Avatar
Maros2470:10.5.2014 18:55

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
Tvůrce
Avatar
Odpovídá na Maros2470
Gramli:10.5.2014 20:17

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
rawen
Člen
Avatar
Odpovídá na Maros2470
rawen:10.5.2014 20:18

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:10.5.2014 20:36

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
rawen
Člen
Avatar
Odpovídá na Maros2470
rawen:10.5.2014 20:49

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 rawen
Maros2470:10.5.2014 21:02

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
rawen
Člen
Avatar
Odpovídá na Maros2470
rawen:10.5.2014 21:03

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 rawen
Maros2470:10.5.2014 21:05

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

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

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 rawen
Maros2470:10.5.2014 21:58

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:10.5.2014 22:06

Už je to OK. Díky za rady

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

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
10.5.2014 22:27
Co můžeš naprogramovat dnes, neodkládej na zítřek.
Avatar
Maros2470
Člen
Avatar
Odpovídá na rawen
Maros2470:11.5.2014 11:15

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
rawen
Člen
Avatar
Odpovídá na Maros2470
rawen:11.5.2014 14:00

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 rawen
Maros2470:11.5.2014 14:26

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
rawen
Člen
Avatar
Odpovídá na Maros2470
rawen:11.5.2014 14:41

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 rawen
Maros2470:11.5.2014 14:51

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 rawen
Maros2470:11.5.2014 14:59

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:11.5.2014 15:06

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
rawen
Člen
Avatar
Odpovídá na Maros2470
rawen:11.5.2014 15:12

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 rawen
Maros2470:11.5.2014 16:25

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
rawen
Člen
Avatar
Odpovídá na Maros2470
rawen:11.5.2014 17:27

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:12.5.2014 10:26

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.