Diskuze: Vyhledávání v dataGrid
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 23 zpráv z 23.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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
}
}
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 Č
}
}
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_TextChanged(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.Contains(bankaTextBox.Text)) // jeslize ten string obsahuje
text z Textboxu
dataGridView1.Rows[i].Selected = true; // oznacim radek
}
}
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.
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.
banka = dataGridView1.Rows[i].Cells[1].Value.ToString();
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))
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].Selected = false;, ale to nefunguje
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.
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.
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.
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
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].Selected = 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
V Delphi byla přímo sada navigačních tlačítek, které se spojily s tabulkou a bylo to hotové
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...
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
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.
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á.
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...
Zobrazeno 23 zpráv z 23.