Tworzenie tabeli przy użyciu TextBoxa – #3

Krótki opis całego programu: Program do dynamicznego tworzenia tablicy z TextBox’ów o zadanej ilości komórek, wraz z możliwością zmiany niektórych właściwości wybranych komórek.

Co tym razem: Zmiana właściwości wybranej komórki w tabeli – kolor tekstu oraz tła komórki

Tym razem zajmiemy się dodatkami wizualnymi dla utworzonej tabeli, a dokładnie zmianą koloru tła oraz tekstu dla wybranej komórki. Wybieranie komórki, będzie odbywało się poprzez kliknięcie przyciskiem myszy – lewym – a ustawianie danych kolorów poprzez przycisk typu Button.

Umieszczamy na naszej formatce 2 labele, oraz 2 textboxy oraz jeden przycisk. Opisujemy je tak jak jest pokazane na zdjęciu (kolor tła, kolor tekstu, a przycisk ustaw). Aby pojawiał się jakiś domyślny tekst przy uruchamianiu naszej aplikacji we właściwościach textboxa wpisujemy „Przykładowy” do parametru Text. Aby możliwa była zmiana koloru, należy jeszcze dodać kontrolkę, która będzie powodowała otwarcie okienka umożliwiającego wybranie tego koloru. Z przybornika kontrolek wybieramy ColorDialog (znajduje się w kategorii okna dialogowe) i przenosimy ją na naszą formatkę. Zostanie dodana w dolnej części – nie będzie ona bezpośrednio znajdować się na formatce.

Aby otworzyć okienko wyboru koloru posłużymy się zdarzeniem polegającym na dwukrotnym kliknięciu LPM (lewym przyciskiem myszy) na naszego textboxa. Przechodzimy więc do obsługi zdarzeń naszej kontrolki i wybieramy zdarzenie DoubleClick – klikamy na niego dwa razy, po czym program przeniesie nas do kodu obsługującego te zdarzenie. Posłużymy się teraz notą katalogową dla kontrolki colordialog.

W pierwszej kolejności musimy otworzyć to okienko, więc szukamy metody która będzie powodować otwieranie go. Metoda ta nazywa się showdialog(). Więc spróbujmy i zobaczmy co się stanie jak ją wywołamy w tym zdarzeniu. Umieszczamy więc w zdarzeniu DoubleClick() kod:

private void textBox_tlo_DoubleClick(object sender, EventArgs e)
{
	colorDialog1.ShowDialog();
}

Po uruchomieniu programu i dwukrotnym kliknięciu LPM na nasz textbox pojawi się okienko umożliwiające wybór kolor. Dobra, to już mamy możliwość wyboru koloru, ale jak teraz ten kolor zapisać jako kolor tła i tekstu? Zobaczmy co mówi nasza dokumentacja – przechodzimy więc w niej do samej metody showdialog()

W niej znajdujemy następujący przykład:

private void button1_Click(object sender, System.EventArgs e)
 {
    ColorDialog MyDialog = new ColorDialog();
    // Keeps the user from selecting a custom color.
    MyDialog.AllowFullOpen = false ;
    // Allows the user to get help. (The default is false.)
    MyDialog.ShowHelp = true ;
    // Sets the initial color select to the current text color.
    MyDialog.Color = textBox1.ForeColor ;
    
    // Update the text box color if the user clicks OK 
    if (MyDialog.ShowDialog() == DialogResult.OK)
        textBox1.ForeColor =  MyDialog.Color;
 }

Który odnosi się do przycisku, ale wykorzystamy go i zmodyfikujemy na nasze potrzeby. Pierwsza linijka tworzy obiekt, który my dodaliśmy już jako kontrolka – jest to obiekt związany z okienkiem dot. wyboru koloru. Można to rozwiązać w ten sposób co jest w dokumentacji jak i sposobem poprzez dodanie samej kontrolki. Dodanie poprzez kontrolkę umożliwia konfigurację jej w sposób łatwy poprzez klikanie, natomiast tworzenie nowego obiektu jak jest w przykładzie pokazane, konieczne jest jeszcze ręczne skonfigurowanie go. Dlatego w kolejnych linijkach pozwalamy bądź nie na ustawienie koloru niestandardowego, pokazanie pomocy itp. Kolejna linijka powoduje przypisanie obecnego koloru jako domyślnego – możemy ją wykorzystać bądź i nie. Następnie mamy kawałek kodu który powoduje otwarcie okienka i w przypadku gdy zostanie zamknięty poprzez przycisk OK kolor zostanie przepisany do zmiennej. Możemy ten warunek zmienić od innego sposobu zamknięcia, ale my zostawimy go to jak jest pokazane w przykładzie. Więc nasz kod powodujący zapamiętanie koloru wygląda następująco:

private void textBox_tlo_DoubleClick(object sender, EventArgs e)
{
	if(colorDialog1.ShowDialog() == DialogResult.OK)
	{
		kolor_tla = colorDialog1.Color;
	}
}

Dodatkowo tworzymy jeszcze zmienną, którą umieszczamy na początku klasy – a nawet dwie, bo i dla koloru tekstu. Ustalamy przy okazji początkowe kolory dla tekstu, oraz tła, które będą ulegać zmianie:

Color kolor_tla = Color.White;
Color kolor_tekstu = Color.Black;

Zróbmy jeszcze tak, aby kolor który ustawiliśmy został ustawiony również w obu textboxach które dotyczą właśnie zmiany koloru tła oraz tekstu. Zmiana tła jest dość prosta, polega jedynie na wpisaniu nowej właściwości do odpowiedniej kontrolki:

private void textBox_tlo_DoubleClick(object sender, EventArgs e)
{
	if(colorDialog1.ShowDialog() == DialogResult.OK)
	{
		kolor_tla = colorDialog1.Color;
		textBox_tlo.BackColor = kolor_tla;
		textBox_tekst.BackColor = kolor_tla;
	}
}

To samo należy zrobić dla tekstu. Nie będę już przedstawiał całego procesu dla zmiany koloru tekstu. Zróbcie to sobie w ramach zadania. Poprawny kod, znajduje się jak zwykle na samym końcu wpisu.

Na razie zostawmy zmianę koloru a zajmijmy się jak odczytać wskazaną komórkę, która na dodatek tworzona jest dynamicznie. Zacznijmy więc od początku, żeby się nie pogubić. Musimy najpierw utworzyć oraz dodać zdarzenie od kliknięcia myszą na utworzoną komórkę. Aby sprawdzić jak dodawane jest nowe zdarzenie, dodajmy takie przykładowe zdarzenie dla dowolnego textboxa – w zdarzeniach szukamy mouseclick i klikamy na niego dwukrotnie aby takie zdarzenie zostało utworzone. Następnie przejdźmy do kodu gdzie Visual Studio konfiguruje nam tą kontrolkę. Sposób postępowania już powinniście znać z poprzedniego wpisu. Dla przypomnienia umieszczam screen jak to wygląda gdy program nam utworzył takie zdarzenie.

Możemy je skopiować i dodać do pętli gdzie tworzona jest nasza tabela, tylko lekko ją należy przystosować do naszych potrzeb. Argumentem jaki przekazujemy jest „uchwyt” do zdarzenia. Visual studio sugeruje nam kilka rozwiązań, jednym z nich jest utworzenie metody – wybieramy je. Tak więc mamy już przypisane zdarzenie do każdej komórki z naszej tabeli oraz wstępną obsługę tego zdarzenia.

private void button_utworz_Click(object sender, EventArgs e)
{
	liczba_kolumn = Convert.ToInt16(textBox_kolumny.Text);
	szerokosc_kolumn = Convert.ToInt16(textBox_szer_komorki.Text);
	//sprawdzenie czy tworzymy tabelę od ilości komórek czy wierszy
	if (textBox_komorki.Text == "")
	{
		liczba_wierszy = Convert.ToInt16(textBox_wiersze.Text);
		liczba_komorek = liczba_kolumn * liczba_wierszy;
		textBox_komorki.Text = liczba_komorek.ToString();
	}
	else
	{
		liczba_komorek = Convert.ToInt16(textBox_komorki.Text);
	}
	nr_pierwszy = panel1.Controls.Count;
	//pętla główna dla wszystkich komórek
	for (int i = 0, x = 1, y = 0; i < liczba_komorek; x++)
        {
		//pętla tworząca komórki w danym wierszu
		for(y =0; (y < liczba_kolumn) && (i < liczba_komorek) ; y++, i++)
		{
			//tworzymy nową kontrolkę - textbox, button, oraz label
			TextBox ntextbox = new TextBox();
			//umieszczanie na ekranie danej kontrolki
			ntextbox.Location = new System.Drawing.Point(3 + szerokosc_kolumn * y, 3 + 20 * x);
			//określenie rozmiarów kontrolki
			ntextbox.Size = new System.Drawing.Size(szerokosc_kolumn, 20);
			//przypisanie nazwy danej kontrolce
			ntextbox.Name = "d_box_" + i.ToString();
			//konfiguracja danej kontrolki - wyswietlany tekst, ewentualne ustawienia
			//ustawienie zdarzenia 
			ntextbox.MouseClick += new System.Windows.Forms.MouseEventHandler(Ntextbox_MouseClick);
			
			//dodanie kontrolek do formularza (do kolekcji - tablicy)
			panel1.Controls.Add(ntextbox);
		}
        }
	nr_ostatni = Controls.Count;
}
private void Ntextbox_MouseClick(object sender, MouseEventArgs e)
{
}

Teraz przyszła pora na odczyt klikniętej komórki. Umieśćmy na naszej formatce dodatkową kontrolkę typu textbox, aby można było w niej wyświetlać nazwę wskazanej komórki. Przejdźmy teraz do samego zdarzenia od kliknięcia. Przekazywany jest do tego zdarzenia wskaźnik na obiekt, który wywołał to zdarzenie (object sender), oraz argumenty zdarzenia. W celu wydobycia informacji, która komórka została wybrana wykorzystamy właśnie wskaźnik na obiekt. Należy więc zapamiętać „zmienną” sender. Tworzymy na początku klasy zmienną typu object, ja nazwałem ją send, a następnie w metodzie obsługującej to zdarzenie przepisujemy aktualny wskaźnik do zmiennej. Dla celów testowych po przepisaniu tego wskaźnika, wyświetlmy nazwę tej komórki we wcześniej umieszczonym textboxie. Aby tego dokonać wykorzystamy operator rzutowania as – spowoduje on, że dana zmienna będzie „widziana” przez kompilator jako obiekt w tym przypadku typu textbox.

private void Ntextbox_MouseClick(object sender, MouseEventArgs e)
{
	send = sender;
	textBox_ktora.Text = (send as TextBox).Name;
}

Kompilujemy i uruchamiamy nasz program. Po utworzeniu tabeli i kliknięciu na wybraną komórkę powinna pojawić się jej nazwa w textboxie. OK – jesteśmy już coraz bliżej końca. Jak już wiemy którą komórkę wskazujemy to teraz wystarczy tylko po wciśnięciu przycisku ustaw zmienić jej właściwości. Przechodzimy więc do zdarzenia od przycisku ustaw – klikamy na niego dwa razy – i przy użyciu operatora rzutowania na zmienną send zmieniamy kolor tła oraz tekstu

private void button1_Click(object sender, EventArgs e)
{
	(send as TextBox).BackColor = kolor_tla;
	(send as TextBox).ForeColor = kolor_tekstu;
}

Kompilujemy i sprawdzamy. Po ustawieniu kolorów, można zmieniać każdą wskazaną komórkę z osobna – należy za każdym razem wcisnąć przycisk ustaw. I to byłoby na tyle.

Jak widzicie dość często korzystam z dokumentacji bardzo pomaga. Jeżeli dokumentacja jest dobrze napisana to można w niej szybciej znaleźć informacje niż przeszukując otchłanie internetu. Tak więc zachęcam do komentowania, a program jak zwykle można pobrać tutaj:

Pobierz “CS19_N01_tabela_3”

CS19_N01_tabela_3.zip – Pobrano 130 razy – 75,29 KB

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *