Tabulková data budeme pracovat s CSV soubory položky oddělené středníkem, např. Číslo zákazníka;příjmení;jméno;datum narození 17;Novotná;Bohdana;25.11.1982 22;Kender;David;24.12.1986 29;Čihák;Jan;18.3.1969 33;Zdobinská;Vlasta;19.6.1932 43;Pohořalá;Michaela;22.6.1946 51;Brejcha;Jiří;27.4.1945 60;Kubále;Zdeněk;8.10.1943 68;Hemelík;Miroslav;21.6.1973 71;Hessingová;Lucie;12.4.1930 75;Balada;Jakub;2.2.1962 76;Kotýnek;Jaroslav;11.7.1948 78;Popek;Marian;1.12.1963 82;Prokopcová;Jiřina;2.11.1963 91;Šachová;Lucie;6.7.1965
Filtrování program, který načte CSV soubor a vyfiltruje ženy narozené 1970 a dříve http://www.gfp.cz/prg/zakaznici.csv
private void tlačítkoprocházetvýchozí_click(object sender, EventArgs e) if (oknootevřenísouboru.showdialog() == DialogResult.OK) polevýchozí.text = oknootevřenísouboru.filename; private void tlačítkoprocházetvýsledný_click(object sender, EventArgs e) if (oknouloženísouboru.showdialog() == DialogResult.OK) polevýsledný.text = oknouloženísouboru.filename; // Přečtení a zápis prvního řádku (záhlaví) string záhlaví = výchozí.readline(); výsledný.writeline(záhlaví); // Čtení z výchozího, vyhodnocení a případný zápis do výsledného string řádek; while ((řádek = výchozí.readline())!= null) // Částečné dekódování řádku string[] hodnoty = řádek.split(';'); string hodnotapohlaví = hodnoty[3].trim().tolower(); bool žena = hodnotapohlaví == "žena"; string hodnotaroknarození = hodnoty[4].trim(); int roknarození = Convert.ToInt32(hodnotaRokNarození); private void tlačítkovyber_click(object sender, EventArgs e) // Otevření souborů StreamReader výchozí = new StreamReader(poleVýchozí.Text, Encoding.Default); StreamWriter výsledný = new StreamWriter(poleVýsledný.Text, false, Encoding.Default); // Ženy ročník 1970 a starší do výsledného souboru if (žena && roknarození <= 1970) výsledný.writeline(řádek); // Zavření obou souborů výchozí.close(); výsledný.close(); MessageBox.Show("HOTOVO!"); Split(oddělovač) rozdělí řetězec na pole položek Trim() zlikviduje mezery na začátku a konci řetězce ToLower() převede řetězec na malá písmena
Práce s datem http://www.gfp.cz/prg/zakaznici_s_daty_narozeni.csv instance DateTime k uložení jednoho data a času různé varianty konstruktorů rok, měsíc, den rok, měsíc, den, hodina, minuta, sekunda a další DateTime.Today dnešní datum v 0:00:00 DateTime.Now dnešní datum a aktuální čas vlastnosti Year, Month, Day, Hour, Minute, Second, Millisecond, DayOfWeek, DayOfYear AddXXX umí přidat udaný počet dní, hodin dvě instance DateTime lze odečítat a výsledek uložit do instance TimeSpan, která má např. užitečnou vlastnost Days
private void knoflíky_checkedchanged(object sender, EventArgs e) // Pole pro zadání data bude aktivní pouze tehdy, když // uživatel zvolí variantu "Jindy" poledatum.enabled = knoflíkjindy.checked; private void tlačítkoprocházet_click(object sender, EventArgs e) if (oknootevřenísouboru.showdialog() == DialogResult.OK) polesoubor.text = oknootevřenísouboru.filename; private void tlačítkovypiš_click(object sender, EventArgs e) // Které datum se hledá? DateTime dnes = DateTime.Today; DateTime hledanédatum; if (knoflíkdnes.checked) hledanédatum = dnes; else if (knoflíkzítra.checked) hledanédatum = dnes.adddays(1); else int letošnírok = dnes.year; hledanédatum = Convert.ToDateTime(poleDatum.Text + letošnírok.tostring()); // Otevření souboru a přeskočení řádku se záhlavím string jménosouboru = polesoubor.text; StreamReader soubor = new StreamReader(jménoSouboru, Encoding.Default); soubor.readline(); // Čtení položku za položkou a zpracování string řádek, zpráva = null; while ((řádek = soubor.readline())!= null) // Řádek se rozdělí na hodnoty string[] hodnoty = řádek.split(';'); // Separování jednotlivých hodnot string číslozákazníka = hodnoty[0]; string příjmení = hodnoty[1]; string jméno = hodnoty[2]; string datumnarozenítextem = hodnoty[3]; DateTime datumnarození = Convert.ToDateTime(datumNarozeníTextem); // Má narozeniny? if (datumnarození.day == hledanédatum.day && datumnarození.month == hledanédatum.month) zpráva += jméno + " " + příjmení + " (č. " + číslozákazníka + ")" + Environment.NewLine; // Zavření souboru, zobrazení zprávy soubor.close(); if (zpráva == null) zpráva = "V uvedený den nemá narozeniny žádný zákazník"; polezobrazení.text = zpráva;
Editace dat v tabulce v kategorii Data použijeme DataGridView vlastnost Dock dáme na Fill vyplní zbytek okna
definice sloupců se provádí ve vlastnosti Columns
Definice barev v okně editace sloupců vlastnost DefaultCellStyle tam BackColor, ForeColor, SelectionBackColor, SelectionForeColor RowsDefaultCellStyle určuje nastavení barev podle řádků rozlišení na liché a sudé zajistí AlternatingRowsDefaultCellStyle
Vlastnosti ovlivňující, co smí uživatel AllowUserToAddRows uživatel smí přidávat řádky AllowUserToDeleteRows smí mazat AllowUserToOrderColumns smí měnit tažením pořadí sloupců AllowUserToResizeColumns smí měnit velikost sloupců AllowUserToResizeRows smí měnit výšku řádků
Přístup k datům v tabulce vlastnost Rows seznam řádků, pomocí indexu dostupný každý řádek každý řádek je instance DataGridViewRow vlastnost Cells seznam buněk řádku, seznam lze indexovat číslem sloupce nebo názvem sloupce v uvozovkách buňky jsou instance DataGridViewCell zajímavá hlavně vlastnost Value většinou volaná metodou ToString
ulož řetězec ahoj do druhé buňky prvního řádku DataGridViewRow prvnířádek = tabulka.rows[0]; prvnířádek.cells[1].value = ahoj ; z prvního řádku zobraz buňku ze sloupce sloupecbydliště DataGridViewCell buňka = tabulka.rows[0].cells[ sloupecbydliště ]; string hodnota = buňka.value.tostring(); MessageBox.Show(hodnota);
lze přistupovat i pomocí dvojice indexů řádek, sloupec pozn. použito automatické zjištění typu proměnné pomocí var když zapomenu přesný název typu buňky // 2. buňka, 1. řádku tabulka[0, 1].Value = ahoj ; var buňka = tabulka[ sloupecbydliště, 0]; string hodnota = buňka.value.tostring(); MessageBox.Show(hodnota);
Plnění tabulky metoda Add na seznam řádků Rows více variant např. jedna přebírá pole hodnot string[] hodnoty = new string[] Franta, Vomáčka, Neratovice ; tabulka.rows.add(hodnoty);
using System; using System.IO; using System.Text; using System.Windows.Forms; namespace Editace_tabulkových_dat public partial class oknoprogramu : Form string jménosouboru = null; public oknoprogramu() InitializeComponent(); private void nabídkasouborotevřít_click(object sender, EventArgs e) // Zjisti jméno souboru if (oknootevřenísouboru.showdialog()!= DialogResult.OK) return; jménosouboru = oknootevřenísouboru.filename; // Načítej soubor... StreamReader soubor = new StreamReader(jménoSouboru, Encoding.Default); // Hlavičku přečteme, ale v tomto programu nezpracováváme string hlavička = soubor.readline(); // Vymaž stávající hodnoty z tabulky tabulka.rows.clear(); // Postupně načítej řádky a přidávej do tabulky string řádek; while ((řádek = soubor.readline())!= null) string[] hodnoty = řádek.split(';'); tabulka.rows.add(hodnoty); // Zavři soubor soubor.close(); private void nabídkasouboruložit_click(object sender, EventArgs e) if (sender == nabídkasouboruložitjako jménosouboru == null) // Zjisti jméno souboru if (oknouloženísouboru.showdialog()!= DialogResult.OK) return; jménosouboru = oknouloženísouboru.filename; // Zapisuj soubor... StreamWriter soubor = new StreamWriter(jménoSouboru, false, Encoding.Default); // Zapiš hlavičkový řádek string hlavička = "Příjmení;Jméno;Místo bydliště"; soubor.writeline(hlavička); // Zapiš jednotlivé řádky tabulky int početřádků = tabulka.rows.count; int početsloupců = tabulka.columns.count; for (int číslořádku = 0; číslořádku < početřádků; číslořádku++) string řádek = null; for (int číslosloupce = 0; číslosloupce < početsloupců; číslosloupce++) řádek += tabulka[číslosloupce, číslořádku].value.tostring(); if (číslosloupce < početsloupců - 1) řádek += ";"; soubor.writeline(řádek); // Zavři soubor soubor.close(); private void nabídkasouborkonec_click(object sender, EventArgs e) Close(); private void nabídkazákazníknový_click(object sender, EventArgs e) string[] prázdnéhodnoty = new string[3]"", "", ""; tabulka.rows.add(prázdnéhodnoty); private void nabídkazákazníkodstranit_click(object sender, EventArgs e) var aktivníbuňka = tabulka.currentcell; if (aktivníbuňka!= null) int číslořádku = aktivníbuňka.rowindex; tabulka.rows.removeat(číslořádku);
Př. program, který rozloží větu na jednotlivá slova. Interpunkci pro jednoduchost neřešte, tj. použijeme Split na rozdělení dle mezer.
Př. program, který vypíše všechna data letošního roku. Tip: Vyrobte si datum 1. ledna letošního roku (DateTime datum = new DateTime(letošníRok, 1, 1);) a přidávejte dny (AddDays), dokud se nezmění rok. K zobrazení použijte ToLongDateString().
Př. program, který načte z CSV souboru data ve formátu příjmení; jméno; známka z M, známka z ČJ, známka z PRG a uloží do jiného CSV souboru data ve formátu příjmení; jméno; průměrný prospěch
Př. program, který sečte myší označené buňky. Tabulka je vyplněna náhodně. Tip: Seznam vybraných buněk se získá dotazem na hodnotu vlastnosti SelectedCells tabulky.
Kalendář prvek DateTimePicker hlavní vlastnost Value typu DateTime vyzkoušejte
Bublinová nápověda prvek ToolTip dáme do okna potom u dalších prvků nastavujeme vlastnost Tooltip na XXX na požadovanou hodnotu lze měnit barvy, ikonu