{"id":1412,"date":"2020-04-26T21:49:48","date_gmt":"2020-04-26T19:49:48","guid":{"rendered":"http:\/\/www.daniel.slask.pl\/?p=1412"},"modified":"2021-02-09T21:54:59","modified_gmt":"2021-02-09T20:54:59","slug":"tworzenie-tabeli-przy-uzyciu-textboxa-1","status":"publish","type":"post","link":"https:\/\/daniel.slask.pl\/m\/tworzenie-tabeli-przy-uzyciu-textboxa-1\/","title":{"rendered":"Tworzenie tabeli przy u\u017cyciu textboxa &#8211; #1"},"content":{"rendered":"\n<p>Kr\u00f3tki opis ca\u0142ego programu kt\u00f3ry zostanie wykonany: Program do dynamicznego tworzenia tablicy z TextBox&#8217;\u00f3w o zadanej ilo\u015bci kom\u00f3rek, wraz z mo\u017cliwo\u015bci\u0105 zmiany niekt\u00f3rych w\u0142a\u015bciwo\u015bci wybranych kom\u00f3rek.<\/p>\n\n\n\n<p>Co tym razem: Tworzenie tabeli z wykorzystaniem TextBoxa w g\u0142\u00f3wnym oknie tabeli o podanej ilo\u015bci kom\u00f3rek i w podanej ilo\u015bci kolumn.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Tym wpisem rozpoczynam minicykl &#8211; mo\u017ce 3-4 &#8211; wpis\u00f3w kt\u00f3ry jest cz\u0119\u015bci\u0105 ca\u0142ego dzia\u0142u dotycz\u0105cego programowania w C# w Visual Studio.<\/p>\n\n\n\n<p>Dlaczego minicykl kilku wpis\u00f3w o programowaniu w C# &#8211; a to dlatego, \u017ce b\u0119dzie on dotyczy\u0142 kilku, kilkunastu zagadnie\u0144 kt\u00f3re zostan\u0105 poruszane w programie, kt\u00f3ry zaraz wam opisz\u0119.<\/p>\n\n\n\n<p>Mam zamiar r\u00f3wnie\u017c opisa\u0107, w jaki spos\u00f3b szuka\u0142em informacji, oraz sposob\u00f3w rozwi\u0105zania danego problemu. Czy mi si\u0119 uda &#8211; tego nie wiem. Oka\u017ce si\u0119 po waszych komentarzach. Ostrzegam r\u00f3wnie\u017c, \u017ce mog\u0105 pojawi\u0107 si\u0119 jakie\u015b b\u0142\u0119dy merytoryczne, oraz b\u0142\u0119dy dot. zasad programowania w C# &#8211; dlatego prosz\u0119 o wyrozumia\u0142o\u015b\u0107, oraz wskazywanie takich b\u0142\u0119d\u00f3w, a jak b\u0119dzie wyja\u015bnienie takiego b\u0142\u0119du to b\u0119dzie super. Ja co\u015b wam daj\u0119, a i wy co\u015b mi zaoferujecie \ud83d\ude09<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Program, kt\u00f3ry wykonamy b\u0119dzie umo\u017cliwia\u0142 utworzenie tablica o n kom\u00f3rkach i m wierszach &#8211; poka\u017ce te\u017c jak zmieni\u0107 to kod aby tworzy\u0142 tabel\u0119 o x wierszach i z kolumnach. Dodatkowo b\u0119dzie mo\u017cliwo\u015b\u0107 zmiany koloru danej kom\u00f3rki i tekstu w niej. B\u0119dzie r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 dodania inkrementacji warto\u015bci w wybranych kom\u00f3rkach. To z takich wa\u017cniejszych w\u0142a\u015bciwo\u015bci &#8211; b\u0119dzie ich wi\u0119cej, ale oka\u017ce si\u0119 to podczas tego mini cyklu. W ostatnim poradniku, przedstawi\u0119 dane funkcje tego programu, jak i ca\u0142y kompletny program z kodem. Pod koniec ka\u017cdego wpisu, r\u00f3wnie\u017c zostanie umieszczony ca\u0142y program z kodem, aby mo\u017cna by\u0142o z \u0142atwo\u015bci\u0105 sprawdzi\u0107 dzia\u0142anie kodu.<\/p>\n\n\n\n<p>Pewnie nasuwa si\u0119 wam my\u015bl &#8211; po co to komu?! Program ten napisa\u0142em do test\u00f3w &#8211; w programie kt\u00f3ry pisz\u0119, potrzebuj\u0119 mie\u0107 mo\u017cliwo\u015bci takie jak tutaj przedstawiam. A r\u00f3wnie\u017c chcia\u0142em pokaza\u0107 wam w jaki spos\u00f3b mo\u017cna znale\u017a\u0107 rozwi\u0105zanie danego problemu, a i mo\u017ce kto\u015b b\u0119dzie chcia\u0142 utworzy\u0107 niestandardow\u0105 tabel\u0119 z r\u00f3\u017cna ilo\u015bci\u0105 kom\u00f3rek.<\/p>\n\n\n\n<p>Jest to poradnik skierowany te\u017c dla pocz\u0105tkuj\u0105cych, wi\u0119c wszystko postaram si\u0119 opisywa\u0107 dok\u0142adnie &#8211; nawet proste rzeczy, szczeg\u00f3lnie w pierwszej cz\u0119\u015bci<\/p>\n\n\n\n<hr class=\"wp-block-separator has-text-color has-background has-vivid-cyan-blue-background-color has-vivid-cyan-blue-color\"\/>\n\n\n\n<p>Na temat dynamicznego tworzenia kontrolek, umieszcza\u0142em ju\u017c wpis, kt\u00f3ry znajduje si\u0119 w <a href=\"http:\/\/www.daniel.slask.pl\/?p=523\">tym miejscu<\/a>. Wykorzystamy cz\u0119\u015b\u0107 kodu (prawie ca\u0142y) w tej cz\u0119\u015bci, dot. powielania danej kontrolki, ale zacznijmy jeszcze wcze\u015bniej, czyli od utworzenia projektu i naniesienia odpowiednich komponent\u00f3w na formatk\u0119.<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-2 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1251\" height=\"722\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-1.png\" alt=\"\" data-id=\"1420\" data-full-url=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-1.png\" data-link=\"http:\/\/www.daniel.slask.pl\/?attachment_id=1420\" class=\"wp-image-1420\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-1.png 1251w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-1-300x173.png 300w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-1-768x443.png 768w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-1-956x552.png 956w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-1-400x231.png 400w\" sizes=\"(max-width: 1251px) 100vw, 1251px\" \/><\/a><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"815\" height=\"490\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-3.png\" alt=\"\" data-id=\"1421\" data-full-url=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-3.png\" data-link=\"http:\/\/www.daniel.slask.pl\/?attachment_id=1421\" class=\"wp-image-1421\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-3.png 815w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-3-300x180.png 300w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-3-768x462.png 768w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-3-400x240.png 400w\" sizes=\"(max-width: 815px) 100vw, 815px\" \/><\/a><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Tak wi\u0119c tworzy nowy projekt <em>Aplikacja Windows Form<\/em>. W nowo utworzonym projekcie na formatce dodajemy 4 <em>textboxy<\/em>, 4 <em>labele<\/em>, oraz 3 przyciski. Na chwil\u0119 obecn\u0105 tylko tyle &#8211; w tej cz\u0119\u015bci to nam b\u0119dzie tylko potrzebne. Umieszczamy i opisujemy wszystko tak jak jest na przyk\u0142adowym obrazku (no mo\u017ce rozmieszczenie zr\u00f3bcie sobie dowolne). Ja od jakiego\u015b czasu mam zwyczaj, \u017ce zmieniam nazwy komponent\u00f3w w ten spos\u00f3b aby \u0142atwo by\u0142o je odnale\u017a\u0107 &#8211; czyli zostawiam oznaczenie, kt\u00f3re okre\u015bla jaki to jest komponent, np. <em>Button<\/em>, i dodaj\u0119 opis, np. button_zamknij. Nazwy labeli przewa\u017cnie zostawiam domy\u015blne, chyba \u017ce wykorzystuj\u0119 je w programie. Pierwszy przycisk kt\u00f3ry oprogramowuj\u0119 jest to przycisk zamykaj\u0105cy aplikacj\u0119. Tak wi\u0119c, klikamy dwa razy na przycisk zamknij i program przeniesie nas do kodu obs\u0142uguj\u0105cego zdarzenie od wci\u015bni\u0119tego przycisku. Wewn\u0105trz kodu umieszczamy polecenie Close():<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp\">private void button_zamknij_Click(object sender, EventArgs e)\n{\n\tClose();\n}<\/code><\/pre>\n\n\n\n<p>Nast\u0119pnie kompilujemy program i uruchamiamy aby sprawdzi\u0107 czy nie zrobili\u015bmy jakiego\u015b b\u0142\u0119du ju\u017c na samym pocz\u0105tku. Polecam i zach\u0119cam aby po wpisaniu nawet najkr\u00f3tszego kawa\u0142ka kodu kompilowa\u0107 go, a je\u017celi jest to uzasadnione uruchamia\u0107 nawet aplikacj\u0119. Uchroni nas to w p\u00f3\u017aniejszym czasie od szukania b\u0142\u0119d\u00f3w w wi\u0119kszej ilo\u015bci kodu.<\/p>\n\n\n\n<p>Je\u017celi wszystko przebieg\u0142o pomy\u015blnie, przechodzimy do utworzenia pierwszych kom\u00f3rek w spos\u00f3b dynamiczny. Tak jak ju\u017c wspomnia\u0142em, wykorzystamy kod z poprzedniego wpisu &#8211; nie b\u0119d\u0119 go tutaj opisywa\u0142, jak ju\u017c jest opisany ;).<\/p>\n\n\n\n<p>Tworzenie tabeli b\u0119dzie wykonywane dopiero po wci\u015bni\u0119ciu przycisku Utw\u00f3rz &#8211; klikamy wi\u0119c na niego dwa razy aby utworzy\u0107 zdarzenie od niego. Uzupe\u0142niamy go kodem kt\u00f3ry umo\u017cliwia tworzenie kontrolek dynamicznie. Przed p\u0119tl\u0105 for umieszczamy jeszcze przepisanie ilo\u015bci kom\u00f3rek do zmiennej (definicja jest umieszczona na pocz\u0105tku klasy Form1, przed inicjalizacj\u0105 tej formatki.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">private void button_utworz_Click(object sender, EventArgs e)\n{\n\tliczba_komorek = Convert.ToInt16(textBox_komorki.Text);\n        for (int i = 0 ; i &lt; liczba_komorek ; i++)\n       {\n            \/\/tworzymy now\u0105 kontrolk\u0119 - textbox, button, oraz label\n            TextBox ntextbox = new TextBox();\n            \/\/umieszczanie na ekranie danej kontrolki x, y\n            ntextbox.Location = new System.Drawing.Point(12, 110 + 26 * i);\n            \/\/okre\u015blenie rozmiar\u00f3w kontrolki\n            ntextbox.Size = new System.Drawing.Size(100, 20);\n            \/\/przypisanie nazwy danej kontrolce\n            ntextbox.Name = \"d_box_\" + i.ToString();\n            \/\/konfiguracja danej kontrolki - wyswietlany tekst, ewentualne ustawienia\n            \/\/ustawienie zdarzenia \n            \/\/dodanie kontrolek do formularza (do kolekcji - tablicy)\n            Controls.Add(ntextbox);\n       }\n}<\/code><\/pre>\n\n\n\n<p>Liczba kom\u00f3rek b\u0119dzie okre\u015bla\u0142a warunek zako\u0144czenia wykonywania p\u0119tli. Kompilujemy i uruchamiamy program. W oknie liczba kom\u00f3rek wpisujemy np. 3. Je\u017celi wszystko zrobili\u015bmy tak jak trzeba pojawi\u0105 nam si\u0119 nowe <em>textboxy <\/em>w jednej kolumnie z przerw\u0105. Aby j\u0105 usun\u0105\u0107 w linijce z umieszczeniem kontrolki na ekranie zmieniamy warto\u015b\u0107 kt\u00f3ra obliczana jest w osi Y. Zmieniamy j\u0105 na wysoko\u015b\u0107 tworzonej kom\u00f3rki na 20. Wi\u0119c ta linijka zmienia si\u0119 na:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">\/\/umieszczanie na ekranie danej kontrolki\nntextbox.Location = new System.Drawing.Point(12, 110 + 20 * i);<\/code><\/pre>\n\n\n\n<p>Teraz zmodyfikujmy tak kod, aby utworzy\u0107 zadan\u0105 ilo\u015b\u0107 kom\u00f3rek w zadanych kolumnach. Modyfikacja b\u0119dzie polega\u0142a na dodaniu jeszcze jednej p\u0119tli, odczytaniu ilo\u015bci kolumn, oraz zmodyfikowaniu kodu odpowiedzialnego za umieszczanie kontrolki na ekranie. W pierwszej kolejno\u015bci tworzymy zmienne dot ilo\u015bci kom\u00f3rek i wpisujemy do niej warto\u015b\u0107 z kontrolki ilo\u015b\u0107 kom\u00f3rek. Ci\u0105gle pracujemy na kodzie pod przyciskiem ustaw. Gdy ju\u017c mamy odczytan\u0105 ilo\u015b\u0107 kolumn dodajemy nast\u0119pn\u0105 p\u0119tl\u0119 for kt\u00f3ra b\u0119dzie mia\u0142a za zadanie kontrolowa\u0107 ilo\u015b\u0107 kom\u00f3rek w danym wierszu. W p\u0119tli tej b\u0119d\u0105 dwa warunki &#8211; pierwszy b\u0119dzie dotyczy\u0107 w\u0142a\u015bnie ilo\u015bci kom\u00f3rek w wierszu, a drugi ilo\u015bci wszystkich wy\u015bwietlonych ju\u017c kom\u00f3rek. Kolejna zmiana dotyczy po\u0142o\u017cenia danego obiektu &#8211; opr\u00f3cz pozycji <em>x<\/em> (czyli wypisywanie wierszami), musimy jeszcze doda\u0107 zmian\u0119 po\u0142o\u017cenia wg osi <em>y<\/em> (wypisywanie kolumnami). Szeroko\u015b\u0107 kom\u00f3rki ustawiona jest na 100, wi\u0119c do obecnej pozycji musimy doda\u0107 100 pomno\u017cone razy numer kolumny. Pami\u0119ta\u0107 nale\u017cy, aby liczy\u0107 od 0, z tego wzgl\u0119du, \u017ce jak policzymy od 1, to b\u0119dziemy mieli przesuni\u0119ta pozycj\u0119 pierwszej kolumny o szeroko\u015b\u0107 jednego obiektu. Ca\u0142y kod wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">private void button_utworz_Click(object sender, EventArgs e)\n{\n\tliczba_komorek = Convert.ToInt16(textBox_komorki.Text);\n\tliczba_kolumn = Convert.ToInt16(textBox_kolumny.Text);\n\t\/\/p\u0119tla g\u0142\u00f3wna dla wszystkich kom\u00f3rek\n\tfor (int i = 0, x = 1, y = 0; i &lt; liczba_komorek; x++)\n        {\n\t\t\/\/p\u0119tla tworz\u0105ca kom\u00f3rki w danym wierszu\n\t\tfor(y =0; (y &lt; liczba_kolumn) &amp;&amp; (i &lt; liczba_komorek) ; y++, i++)\n\t\t{\n\t\t\t\/\/tworzymy now\u0105 kontrolk\u0119 - textbox, button, oraz label\n\t\t\tTextBox ntextbox = new TextBox();\n\t\t\t\/\/umieszczanie na ekranie danej kontrolki\n\t\t\tntextbox.Location = new System.Drawing.Point(12 + 100*y, 110 + 20 * x);\n\t\t\t\/\/okre\u015blenie rozmiar\u00f3w kontrolki\n\t\t\tntextbox.Size = new System.Drawing.Size(100, 20);\n\t\t\t\/\/przypisanie nazwy danej kontrolce\n\t\t\tntextbox.Name = \"d_box_\" + i.ToString();\n\t\t\t\/\/konfiguracja danej kontrolki - wyswietlany tekst, ewentualne ustawienia\n\t\t\t\/\/ustawienie zdarzenia \n\t\t\t\/\/dodanie kontrolek do formularza (do kolekcji - tablicy)\n\t\t\tControls.Add(ntextbox);\n\t\t}\n       }\n} <\/code><\/pre>\n\n\n\n<p>Po skompilowaniu i uruchomieniu programu wpisujemy w pole ilo\u015b\u0107 kom\u00f3rek, oraz liczba kolumn \u017c\u0105dane warto\u015bci. Nie wpisanie \u017cadnej liczby, albo wpisanie inne znaku ni\u017c cyfr spowoduje wyst\u0105pienie b\u0142\u0119du i wy\u0142\u0105czenie programu. Po wpisaniu liczb i klikni\u0119ciu ustaw pojawi si\u0119 nam tabela z okre\u015blon\u0105 liczb\u0105 kolumn i kom\u00f3rek.<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-2 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"817\" height=\"491\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-2.png\" alt=\"\" data-id=\"1422\" data-full-url=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-2.png\" data-link=\"http:\/\/www.daniel.slask.pl\/?attachment_id=1422\" class=\"wp-image-1422\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-2.png 817w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-2-300x180.png 300w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-2-768x462.png 768w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-2-400x240.png 400w\" sizes=\"(max-width: 817px) 100vw, 817px\" \/><\/a><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"816\" height=\"491\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-4.png\" alt=\"\" data-id=\"1423\" data-full-url=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-4.png\" data-link=\"http:\/\/www.daniel.slask.pl\/?attachment_id=1423\" class=\"wp-image-1423\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-4.png 816w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-4-300x181.png 300w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-4-768x462.png 768w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-4-400x241.png 400w\" sizes=\"(max-width: 816px) 100vw, 816px\" \/><\/a><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Kolejny element naszej tabeli, kt\u00f3ry mo\u017ce by\u0107 zmieniany, to szeroko\u015b\u0107 kom\u00f3rki\/kolumny. W dotychczasowym programie ustawiali\u015bmy statycznie szeroko\u015b\u0107 kom\u00f3rki, zmienimy to na szeroko\u015b\u0107 definiowan\u0105 przez nas. Najpierw tworzymy zmienn\u0105 typu int o nazwie <em>szerokosc_kolumn<\/em> i przypisujemy do niej warto\u015b\u0107 z <em>textboxa <\/em>szeroko\u015b\u0107 kom\u00f3rki. Przechodzimy do fragmentu kodu odpowiedzialnego za rysowanie tej kontrolki -&gt; <em>System.Drawing.Size. <\/em>Jako parametry przekazujemy szeroko\u015b\u0107 oraz wysoko\u015b\u0107 elementu. Warto\u015b\u0107 100 zmieniamy na utworzon\u0105 przed chwil\u0105 zmienn\u0105. Pami\u0119ta\u0107 nale\u017cy jeszcze o metodzie, kt\u00f3ra okre\u015bla pocz\u0105tkowy punkt rysowania tej kontrolki -&gt; <em>System.Drawing.Point<\/em>. Przyjmuje ona warto\u015bci x i y &#8211; warto\u015b\u0107 x jest uzale\u017cniona r\u00f3wnie\u017c od szeroko\u015bci kolumny. Tak wi\u0119c r\u00f3wnie\u017c i tutaj zmieniamy warto\u015b\u0107 100 na zmienn\u0105 <em>szerokosc_kolumn<\/em>. Tak zmodyfikowany kod kompilujemy i uruchamiamy.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">private void button_utworz_Click(object sender, EventArgs e)\n{\n\tliczba_komorek = Convert.ToInt16(textBox_komorki.Text);\n\tliczba_kolumn = Convert.ToInt16(textBox_kolumny.Text);\n\tszerokosc_kolumn = Convert.ToInt16(textBox_szer_komorki.Text);\n\t\/\/p\u0119tla g\u0142\u00f3wna dla wszystkich kom\u00f3rek\n\tfor (int i = 0, x = 1, y = 0; i &lt; liczba_komorek; x++)\n       {\n\t\t\/\/p\u0119tla tworz\u0105ca kom\u00f3rki w danym wierszu\n\t\tfor(y =0; (y &lt; liczba_kolumn) &amp;&amp; (i &lt; liczba_komorek) ; y++, i++)\n\t\t{\n\t\t\t\/\/tworzymy now\u0105 kontrolk\u0119 - textbox, button, oraz label\n\t\t\tTextBox ntextbox = new TextBox();\n\t\t\t\/\/umieszczanie na ekranie danej kontrolki\n\t\t\tntextbox.Location = new System.Drawing.Point(12 + szerokosc_kolumn * y, 110 + 20 * x);\n\t\t\t\/\/okre\u015blenie rozmiar\u00f3w kontrolki\n\t\t\tntextbox.Size = new System.Drawing.Size(szerokosc_kolumn, 20);\n\t\t\t\/\/przypisanie nazwy danej kontrolce\n\t\t\tntextbox.Name = \"d_box_\" + i.ToString();\n\t\t\t\/\/konfiguracja danej kontrolki - wyswietlany tekst, ewentualne ustawienia\n\t\t\t\/\/ustawienie zdarzenia \n\t\t\t\/\/dodanie kontrolek do formularza (do kolekcji - tablicy)\n\t\t\tControls.Add(ntextbox);\n\t\t}\n }\n}<\/code><\/pre>\n\n\n\n<p>Jak ju\u017c mamy utworzone kom\u00f3rki, to przyda\u0142oby si\u0119 je skasowa\u0107 &#8211; wyczy\u015bci\u0107 pole formatki. Naciskamy LPM 2 razy na przycisk Wyczy\u015b\u0107, aby utworzy\u0107 zdarzenia dla tego przycisku w kt\u00f3rym wpisujemy komend\u0119 odpowiedzialn\u0105 za wyczyszczenie utworzonych kom\u00f3rek. Skorzystamy teraz z dokumentacji .Net. Kontrolki tworzone s\u0105 w klasie <em>Controls<\/em>, wi\u0119c otwieramy stron\u0119 <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/pl-pl\/dotnet\/api\/system.collections?view=netcore-3.1\" target=\"_blank\">dokumentacji <\/a>dot. tej klasy i przeszukujemy j\u0105 czy znajduj\u0105 si\u0119 tutaj jakie\u015b metody umo\u017cliwiaj\u0105ce usuwanie kontrolki. Znale\u017a\u0107 mo\u017cna kilka metod &#8211; wybierzemy jednak metod\u0119 kt\u00f3ra usuwa kontrolk\u0119 wed\u0142ug indeksu, czyli <em><a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/pl-pl\/dotnet\/api\/system.windows.forms.control.controlcollection.removeat?view=netcore-3.1#System_Windows_Forms_Control_ControlCollection_RemoveAt_System_Int32_\" target=\"_blank\">remoweAt <\/a>.<\/em> Jak mo\u017cna z dokumentacji wyczyta\u0107, po usuni\u0119ciu jednej pozycji, wszystkie indeksy si\u0119 przesuwaj\u0105, czyli b\u0119dziemy przekazywa\u0107 pozycj\u0119 pierwszego elementu kt\u00f3ry utworzyli\u015bmy. B\u0119dziemy tak d\u0142ug\u0105 j\u0105 wykonywa\u0107, a\u017c usuniemy wszystkie pozycje, czyli ilo\u015b\u0107 kom\u00f3rek. A jak odczyta\u0107 pierwszy element kolekcji? Sprawd\u017amy jeszcze raz co oferuje nam <a href=\"https:\/\/docs.microsoft.com\/pl-pl\/dotnet\/api\/system.windows.forms.control.controlcollection?view=netcore-3.1\" target=\"_blank\" rel=\"noreferrer noopener\">dokumentacja<\/a>. Na samym pocz\u0105tku mamy w\u0142a\u015bciwo\u015b\u0107 Count, kt\u00f3ra zwraca liczb\u0119 element\u00f3w w kolekcji &#8211; czyli to czego szukamy. Pobierzemy wi\u0119c t\u0105 warto\u015b\u0107 przed wykonaniem p\u0119tli umieszczaj\u0105cych nasze kontrolki na formatce. Warto\u015b\u0107 t\u0105 przepiszemy do zmiennej <em>int nr_pierwszy<\/em>. Po kompilacji i uruchomieniu programu sprawd\u017amy dzia\u0142anie programu.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">private void button_utworz_Click(object sender, EventArgs e)\n{\n\tliczba_komorek = Convert.ToInt16(textBox_komorki.Text);\n\tliczba_kolumn = Convert.ToInt16(textBox_kolumny.Text);\n\tszerokosc_kolumn = Convert.ToInt16(textBox_szer_komorki.Text);\n\tnr_pierwszy = Controls.Count;\n\t\/\/p\u0119tla g\u0142\u00f3wna dla wszystkich kom\u00f3rek\n\tfor (int i = 0, x = 1, y = 0; i &lt; liczba_komorek; x++)\n        {\n\t\t\/\/p\u0119tla tworz\u0105ca kom\u00f3rki w danym wierszu\n\t\tfor(y =0; (y &lt; liczba_kolumn) &amp;&amp; (i &lt; liczba_komorek) ; y++, i++)\n\t\t{\n\t\t\t\/\/tworzymy now\u0105 kontrolk\u0119 - textbox, button, oraz label\n\t\t\tTextBox ntextbox = new TextBox();\n\t\t\t\/\/umieszczanie na ekranie danej kontrolki\n\t\t\tntextbox.Location = new System.Drawing.Point(12 + szerokosc_kolumn * y, 110 + 20 * x);\n\t\t\t\/\/okre\u015blenie rozmiar\u00f3w kontrolki\n\t\t\tntextbox.Size = new System.Drawing.Size(szerokosc_kolumn, 20);\n\t\t\t\/\/przypisanie nazwy danej kontrolce\n\t\t\tntextbox.Name = \"d_box_\" + i.ToString();\n\t\t\t\/\/konfiguracja danej kontrolki - wyswietlany tekst, ewentualne ustawienia\n\t\t\t\/\/ustawienie zdarzenia \n\t\t\t\/\/dodanie kontrolek do formularza (do kolekcji - tablicy)\n\t\t\tControls.Add(ntextbox);\n\t\t}\n       }\n} \nprivate void button_wyczysc_Click(object sender, EventArgs e)\n{\t\n\tfor (int i= 0; i &lt; liczba_komorek; i++)\n\t{\n\t\tControls.RemoveAt(nr_pierwszy);\n\t}\n}<\/code><\/pre>\n\n\n\n<p>W kodzie kt\u00f3ry ju\u017c otrzymali\u015bmy, tworzymy tabel\u0119 z okre\u015blon\u0105 ilo\u015bci\u0105 kom\u00f3rek i kolumn. Dokonajmy zmiany programu tak, \u017ceby mo\u017cna by\u0142o utworzy\u0107 tabel\u0119 podaj\u0105c liczb\u0119 wierszy i kolumn.<\/p>\n\n\n\n<p>W pierwszej kolejno\u015bci utworzymy warunek sprawdzaj\u0105cy czy zosta\u0142a wpisana ilo\u015b\u0107 kom\u00f3rek do wy\u015bwietlenia czy nie. Je\u017celi nie to w tedy program b\u0119dzie bra\u0142 pod uwag\u0119 liczb\u0119 wierszy. Warunek ten b\u0119dzie mia\u0142 nast\u0119puj\u0105cy wygl\u0105d (znajduje si\u0119 on w przycisku utw\u00f3rz):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">\/\/sprawdzenie czy tworzymy tabel\u0119 od ilo\u015bci kom\u00f3rek czy wierszy\nif (textBox_komorki.Text == \"\")\n{\n\tliczba_wierszy = Convert.ToInt16(textBox_wiersze.Text);\n\tliczba_komorek = liczba_kolumn * liczba_wierszy;\n\ttextBox_komorki.Text = liczba_komorek.ToString();\n}\nelse\n{\n\tliczba_komorek = Convert.ToInt16(textBox_komorki.Text);\n}\n<\/code><\/pre>\n\n\n\n<p>W warunku tym sprawdzamy czy zawarto\u015b\u0107 pola <em>textbox <\/em>jest pusta &#8211; &#8222;&#8221; oznacza tekst bez \u017cadnego znaku. Uwaga!! &#8211; je\u017celi w polach tych b\u0119dzie znajdowa\u0142 si\u0119 jaki\u015b znak, czy to liczba czy litera, b\u0105d\u017a inny znak program b\u0119dzie my\u015bla\u0142, \u017ce jest tam cyfra i przejdzie do tworzenie od ilo\u015bci kolumn. W pewnym momencie wyskoczy b\u0142\u0105d z tego powodu, \u017ce nie znajdzie \u017cadnej cyfry. Program nie jest zabezpieczony przed takimi sytuacjami.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter is-resized\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-5.png\" alt=\"\" class=\"wp-image-1424\" width=\"276\" height=\"175\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-5.png 814w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-5-300x191.png 300w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-5-768x488.png 768w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Tablica_textbox-5-400x254.png 400w\" sizes=\"(max-width: 276px) 100vw, 276px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>&nbsp;Ca\u0142y program pod przyciskiem utw\u00f3rz ma teraz nast\u0119puj\u0105cy wygl\u0105d:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"csharp\" class=\"language-csharp line-numbers\">private void button_utworz_Click(object sender, EventArgs e)\n{\n\tliczba_kolumn = Convert.ToInt16(textBox_kolumny.Text);\n\tszerokosc_kolumn = Convert.ToInt16(textBox_szer_komorki.Text);\n\t\/\/sprawdzenie czy tworzymy tabel\u0119 od ilo\u015bci kom\u00f3rek czy wierszy\n\tif (textBox_komorki.Text == \"\")\n\t{\n\t\tliczba_wierszy = Convert.ToInt16(textBox_wiersze.Text);\n\t\tliczba_komorek = liczba_kolumn * liczba_wierszy;\n\t\ttextBox_komorki.Text = liczba_komorek.ToString();\n\t}\n\telse\n\t{\n\t\tliczba_komorek = Convert.ToInt16(textBox_komorki.Text);\n\t}\n\tnr_pierwszy = Controls.Count;\n\t\/\/p\u0119tla g\u0142\u00f3wna dla wszystkich kom\u00f3rek\n\tfor (int i = 0, x = 1, y = 0; i &lt; liczba_komorek; x++)\n        {\n\t\t\/\/p\u0119tla tworz\u0105ca kom\u00f3rki w danym wierszu\n\t\tfor(y =0; (y &lt; liczba_kolumn) &amp;&amp; (i &lt; liczba_komorek) ; y++, i++)\n\t\t{\n\t\t\t\/\/tworzymy now\u0105 kontrolk\u0119 - textbox, button, oraz label\n\t\t\tTextBox ntextbox = new TextBox();\n\t\t\t\/\/umieszczanie na ekranie danej kontrolki\n\t\t\tntextbox.Location = new System.Drawing.Point(12 + szerokosc_kolumn * y, 110 + 20 * x);\n\t\t\t\/\/okre\u015blenie rozmiar\u00f3w kontrolki\n\t\t\tntextbox.Size = new System.Drawing.Size(szerokosc_kolumn, 20);\n\t\t\t\/\/przypisanie nazwy danej kontrolce\n\t\t\tntextbox.Name = \"d_box_\" + i.ToString();\n\t\t\t\/\/konfiguracja danej kontrolki - wyswietlany tekst, ewentualne ustawienia\n\t\t\t\/\/ustawienie zdarzenia \n\t\t\t\/\/dodanie kontrolek do formularza (do kolekcji - tablicy)\n\t\t\tControls.Add(ntextbox);\n\t\t}\n        }\n}<\/code><\/pre>\n\n\n\n<p>Tak wi\u0119c utworzyli\u015bmy tabel\u0119 z kontrolek <em>textbox <\/em>ze zmienn\u0105 szeroko\u015bci\u0105.<\/p>\n\n\n\n<p>Mam nadziej\u0119, \u017ce uda\u0142o mi si\u0119 opisa\u0107 w spos\u00f3b zrozumia\u0142y to co si\u0119 tutaj dzia\u0142a. Je\u017celi macie jakie\u015b pytania b\u0105d\u017a uwagi do tego co napisa\u0142em, to umieszczajcie je w komentarzach. Za nied\u0142ugo pojawi si\u0119 dalsza cz\u0119\u015b\u0107.<\/p>\n\n\n\n<p>Poni\u017cej znajduje si\u0119 ca\u0142y program do testowania:<\/p>\n\n\n\n<a  data-e-Disable-Page-Transition=\"true\" class=\"download-link download-button aligncenter\" title=\"\" href=\"https:\/\/daniel.slask.pl\/m\/download\/1430\/?tmstv=1788163336\" rel=\"nofollow\" id=\"download-link-1430\" >\n\t<p>\n\t\tPobierz &ldquo;CS19_N01_tabela_1.zip&rdquo;\t<\/p>\n\t<small>CS19_N01_tabela_1.zip\t\t&ndash; Pobrano 327 razy\t\t&ndash; 70,74 KB<\/small>\n<\/a>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Kr\u00f3tki opis ca\u0142ego programu kt\u00f3ry zostanie wykonany: Program do dynamicznego tworzenia tablicy z TextBox&#8217;\u00f3w o zadanej ilo\u015bci kom\u00f3rek, wraz z mo\u017cliwo\u015bci\u0105 zmiany niekt\u00f3rych w\u0142a\u015bciwo\u015bci wybranych kom\u00f3rek. Co tym razem: Tworzenie tabeli z wykorzystaniem TextBoxa w g\u0142\u00f3wnym oknie tabeli o podanej&#8230;<br \/><a class=\"read-more-button\" href=\"https:\/\/daniel.slask.pl\/m\/tworzenie-tabeli-przy-uzyciu-textboxa-1\/\">Wi\u0119cej<\/a><\/p>\n","protected":false},"author":1,"featured_media":1349,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[125,61,8,59],"tags":[192,191,216,215,193],"views":363,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2020\/04\/Csh.png","jetpack_shortlink":"https:\/\/wp.me\/pcPgV3-mM","_links":{"self":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/1412"}],"collection":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/comments?post=1412"}],"version-history":[{"count":8,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/1412\/revisions"}],"predecessor-version":[{"id":1612,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/1412\/revisions\/1612"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media\/1349"}],"wp:attachment":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media?parent=1412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/categories?post=1412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/tags?post=1412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}