03. Przykłady zastosowania popularnych kontrolek - część I
Autor:
Piotr Gaszewski
Opublikowano:
16 grudnia 2005
Odsłon:
134 510
Platforma .NET udostępnia pokaźną ilość kontrolek, które
możemy wykorzystywać przy tworzeniu stron internetowych w technologii ASP.NET.
Wiele tego typu elementów tworzonych i udostępnianych jest również (darmowo, lub
za opłatą) przez niezależne firmy. W rozdziale tym, postaram się zaprezentować
zasady działania i wykorzystywania kilku najpopularniejszych kontrolek.
W poprzednim rozdziale naszego kursu, wykorzystywaliśmy
obiekt Label, służący do wyświetlania tekstu w oknie przeglądarki internetowej.
Po naciśnięciu przycisku następowała zmiana tekstu, wyświetlanego przez tą
kontrolkę. Wyobraźmy sobie sytuację, w której użytkownik musi własnoręcznie
wprowadzić wymagany tekst. Dzieje się tak ogromnej większości rozmaitych
formularzy, umieszczanych na stronach internetowych. Do wprowadzania danych może
posłużyć kontrolka TextBox. W Visual Studio stwórzmy nową stronę, która zawierać
będzie 3 obiekty typu Label, dwa TextBoxy jeden przycisk Buton. Parametry, które
należy zmienić dla każdego z obiektów przedstawiam w poniższej tabeli.
| Klasa obiektu |
ID |
Text |
| Label |
lblName |
Imię: |
| Label |
lblSurname |
Nazwisko: |
| Label |
lblResults |
[pozostawiamy puste] |
| TextBox |
tbName |
[pozostawiamy puste] |
| TextBox |
tbSurname |
[pozostawiamy puste] |
| Button |
btnSubmit |
Wyślij |
Obiekty te możemy rozmieścić na formatce w następujący
sposób:

Użytkownik powinien wprowadzić swoje imię i nazwisko w
odpowiednich TextBoxach. Po naciśnięciu przycisku „Wyślij", chcemy wyświetlić
wprowadzone dane w dolnej części ekranu. Metoda wywoływana w momencie
naciśnięcia przycisku wyglądać będzie następująco:
protected void
btnSubmit_Click(object sender, EventArgs e)
{
this.lblResults.Text =
"Użytkownik: " + this.tbName.Text
+ " " + this.tbSurname.Text;
this.tbName.Text =
"";
this.tbSurname.Text =
"";
}
Pierwsza linia kodu kopiuje zawartość tekst wpisany do pól
tekstowych przez użytkownika. Kolejne wyczyszczą ich zawartość.
Strona startowa:

Po naciśnięciu przycisku „Wyślij":

Jeżeli chcesz, aby elementy strony rozmieszczone były
równo, najprostszym rozwiązaniem będzie umieszczenie ich w tabeli html,
dostępnej w pasku narzędziowym (zakładka: „HTML").
Wyobraźmy sobie teraz sytuację, w której użytkownik, obok
swoich danych pragnie wprowadzić ilość produktów, które prawnie zakupić.
Pierwszym krokiem, który musi uczynić, jest wybranie dostępnych produktów,
kolejnym natomiast wprowadzenie ich liczby i naciśnięcie przycisku „Wyślij". Do
realizacji tego zadania możemy wykorzystać kontrolki o nazwie CheckBox. W oknie
Visual Studio zmodyfikujmy zawartość formatki w następujący sposób:

Załóżmy, że CheckBoxy odpowiadające kolejnym książką, będą
nazywać się odpowiednio: CheckBox1, CheckBox2 i CheckBox3, natomiast TextBoxy:
TextBox1, TextBox2, TextBox3. Ponadto dla wszystkich pól tekstowych, służących
do wprowadzania liczby egzemplarzy książek, ustawiamy w oknie „Properties"
wartość właściwości „Visible" na false.
Dodajmy teraz do naszej klasy reprezentującej formatkę
metodę TotalCost. Metoda ta, sprawdza, w którymś z pól tekstowych podana została
liczba egzemplarzy i zwraca całkowity koszt zakupu lub -1 w przypadku, kiedy
żadne z pól nie zostało wypełnione. Dla ułatwienia przyjmijmy, że każda z
książek kosztuje 20 zł.
int TotalCost()
{
if ((this.TextBox1.Text.Trim() ==
"") &&
(this.TextBox2.Text.Trim() == "") && (this.TextBox3.Text.Trim() ==
""))
{
return -1;
}
int totalCost = 0;
if (this.TextBox1.Text !=
"")
{
totalCost += 20 *
System.Int32.Parse(this.TextBox1.Text);
}
if (this.TextBox2.Text !=
"")
{
totalCost += 20 *
System.Int32.Parse(this.TextBox2.Text);
}
if (this.TextBox3.Text !=
"")
{
totalCost += 20 *
System.Int32.Parse(this.TextBox3.Text);
}
return totalCost;
}
Wykorzystywana w odniesieniu do zawartości każdego z
TextBoxów funkcja Trim() powoduje obcięcie początkowych i końcowych pustych
znaków (tzn. „spacji, tabulatorów itp.). Uwaga – metoda ta nie sprawdza w
jakikolwiek sposób, czy podany ciąg znaków jest naprawdę liczbą. W przypadku
wpisania znaku, który nie jest liczbą mogą wystąpić błędy. W czasie tworzenia
„prawdziwej" aplikacji koniecznie musimy zaimplementować sprawdzanie wejściowego
ciągu.
Kolejnym krokiem, jest modyfikacja zawartości funkcji
Page_Load oraz btnSubmit_Click, uruchamianej w momencie naciśnięcia przycisku
„Wyślij".
protected void Page_Load(object sender, EventArgs e)
{
if(this.CheckBox1.Checked)
{
this.TextBox1.Visible = true;
}
if (this.CheckBox2.Checked)
{
this.TextBox2.Visible = true;
}
if (this.CheckBox3.Checked)
{
this.TextBox3.Visible = true;
}
}
protected
void btnSubmit_Click(object sender, EventArgs e)
{
if (this.TotalCost() != -1)
{
this.lblResults.Text =
"Użytkownik: " + this.tbName.Text +
" " + this.tbSurname.Text;
this.lblResults.Text +=
"<BR>" +
"Calkowity
koszt zakupu: " + this.TotalCost().ToString();
this.tbName.Text =
"";
this.tbSurname.Text =
"";
}
}
Za każdym razem w momencie uruchomienia strony sprawdzane
jest, które z checkBoxów zostały zaznaczone (służy do tego właściwość Checked
tych obiektów). Jeśli wybrana została któraś z książek po przeładowaniu pojawia
się przy niej pole gdzie możemy wprowadzić liczbę zamawianych egzemplarzy. W
przypadku, kiedy przynajmniej jeden z textBox’ów, powiązanych z książkami,
został wypełniony, po naciśnięciu przycisku „Wyślij" następuje wyświetlenie
danych użytkownika, oraz całkowitego kosztu zamówionych książek.
Tak wygląda strona po pierwszym załadowaniu:

Po zaznaczeniu wybranych tytułów i kliknięciu przycisku
„wyślij", po przeładowaniu strony pojawią się pola, w których możemy podać
liczbę egzemplarzy:

Wyrażamy chęć zakupu jednego egzemplarza obu pozycji.
Aplikacja wyświetla nasze dane i oblicza koszt zakupu:

Wyobraźmy sobie sytuację, w której internetowa księgarnia
oferuje 10% zniżki przy zakupie dla określonej grupy klientów. Przyjmijmy, że
będą to posiadacze karty stałego klienta. Dodajmy na formatce obiekt
DropDownList, który odpowiada za wyświetlanie listy rozwijalnej. Po
przeciągnięciu obiektu na formatkę pojawi się okienko zatytułowane „DropDownList
Task", w którym wybieramy opcję „Edit Items". W oknie, które się teraz pojawi („ListItem
Collection Editor") dodajmy dwa nowe pola – pierwsze o parametrach Text = "Nie
posiadam karty stałego klienta", Value = 0 – oraz drugie – Text = "Posiadam
kartę stałego klienta", Value = 1

Po kliknięciu ok., musimy jeszcze wprowadzić zmiany w
metodzie TotalCost.
int TotalCost()
{
if ((this.TextBox1.Text.Trim() ==
"") &&
(this.TextBox2.Text.Trim() == "") && (this.TextBox3.Text.Trim() ==
""))
{
return -1;
}
int totalCost = 0;
if (this.TextBox1.Text !=
"")
{
totalCost += 20 *
System.Int32.Parse(this.TextBox1.Text);
}
if (this.TextBox2.Text !=
"")
{
totalCost += 20 *
System.Int32.Parse(this.TextBox2.Text);
}
if (this.TextBox3.Text !=
"")
{
totalCost += 20 *
System.Int32.Parse(this.TextBox3.Text);
}
if (this.DropDownList1.SelectedValue ==
"1")
{
totalCost = (9 * totalCost) / 10;
}
return totalCost;
}
Przed zwróceniem wartości całkowitego kosztu zakupu program
sprawdza, czy użytkownik nie wybrał opcji "Posiadam kartę stałego klienta". W
tym przypadku całkowity koszt zakupu zostaje zmniejszony o 10%.

Komentarze
punkt 3,2strona 2 linijka;Wyobraźmy sobie teraz sytuację, w której użytkownik, obok swoich danych pragnie wprowadzić ilość produktów, które ***>prawnie<**** zakupić.
beta,
22 maja 2006, 10:01
Beta
hmm...no a lepiej zeby uzytkownik kupowal bez-prawnie ? hihihihi :-P
Piotrze,
Kurs super, od jakiegos czasu podchodzilem do ASP.NET jak do jeza, a tu prosze, szybko, milo i bardzo przystepnie :-)
dzieki!
Xargh,
14 lipca 2006, 13:47
nie rozumiem gdzie trzeba wpisac ta metode TotalCost... czy ktos moglby mi to wyjasnic... juz sie troche z tym mecze i caly czas nie dziala...
help me!!!!!!!!!!!!
szymon,
17 lipca 2006, 14:11
Szymon - jesli stworzyles strone o nazwie np. Default.aspx to pod nia masz plik Default.aspx.cs to wlasnie w tym pliku trzymasz kod C# swojej strony czyli wlasnie tam musisz dopisac funkcje TotalCost.
U mnie wszystko chodzi bez problemu, wiec jak cos to wal na xargh@yahoo.co.uk
Xargh,
17 lipca 2006, 16:53
A ja znowu nie wiem, gdzie wpisać Protected void btnSubmit_Click... Wiem, że w pliku Default.aspx.cs, ale gdzie dokładnie? gdzie bym tego nie wstawił, to podkreśla mi kod, czyli to chyba znaczy, że jest źle... Już nie mam więcej patentów.
Czmielu,
22 lipca 2006, 17:34
Wydaje mi się, że przyszło mi pracować na jakiejś innej wersji programu, czy coś w tym rodzaju, bo struktura pliku Default.aspx.cs jest inna niż wnioskuje u Was :/ Proszę o szybką pomoc...
Czmielu,
22 lipca 2006, 17:48
u mnie tez jest chyba troche inaczej.........
szymon,
24 lipca 2006, 15:25
Witam
a mi przy metodzie totalCost wywala błąd: if ((this.TextBox1...
zatrzymuje się przy this i mówi że po lewej stronie wyrażenia musi być zmienna....
prosze o pomoc (mam uczelnianego VS2005 - chyba developer edition)
kamel,
2 sierpnia 2006, 08:35
a u mnie po wprowadzeniu wszystkich komend tak jak autor kursu opisał, po wyswietleniu stronki i kliknieciu wyślij nie pojawiają się nigdzie dane które wpisałem w okienka ani koszt książek. Prosze o jakąś informacje.
kuku,
11 września 2006, 15:48
Bo metoda TotalCost oblicza tylko cene,jesli czytasz kursy po kolei to zorientujesz się (pownienieś;) że musisz dodać obsługe zdarzenia OnClick żeby wyświetłało ci:
protected void Button1_Click(object sender, EventArgs e)
{
//Jakis label,ktory ma wyswietlic wynik
LabelWyswietlWynik.Text=Label1.Text+" "+Label2.Text+" masz zaplacic"+totalCost.ToString();
}
Aha znajomość C# to podstawa w ASP.NET (no mozna VB.Net ewentualnie)
PanBogactwa,
16 września 2006, 00:12
Ten kod z Page_Load(..) lepiej by wyglądał tak:
protected void Page_Load(object sender, EventArgs e)
{
this.TextBox1.Visible = this.CheckBox1.Checked;
this.TextBox2.Visible = this.CheckBox2.Checked;
this.TextBox3.Visible = this.CheckBox3.Checked;
}
AdamW,
18 maja 2007, 18:53
heeh ja pisze w AS (Action Script 2.0) strasznie to podobne :P łatwo się przyswaja a w programie jest naprawdę wszystko podane na talerzu ;"> heh jeszcze tylko przelecę language reference i umiem ASP :P w stopniu podstawowym ofkors :P
hax0r,
16 czerwca 2007, 01:53
Trochę bez sensu z tym zaznaczaniem Checkboxow, dlaczego musimy przeładowywać stronę, to zupełnie niepraktyczne, nie da się tego zrealizować bez przeładowywania strony, tak na samo klikniecie w CheckBoxa ??
Paweł,
12 września 2007, 13:37
Error 1 "_Default.TotalCost()" is a "method", which is not valid in the given context
mnie sie wysietla cos takiego, mimo ze zrobilem tak jak trzeba!(chyba) czy ktos moze pomoc?
preses,
4 października 2007, 21:36
Dodałem metodę
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
this.TextBox1.Visible = !(this.TextBox1.Visible);
}
I nie wiem dlaczego to działa dopiero po kliknięciu buttona?
pulkownik,
6 listopada 2007, 20:14
Paweł: Trochę bez sensu z tym zaznaczaniem Checkboxow, dlaczego musimy przeładowywać stronę, to zupełnie niepraktyczne, nie da się tego zrealizować bez przeładowywania strony, tak na samo klikniecie w CheckBoxa ??
Da się. Przy widoku "Design" kliknij na CheckBoxa i w "Properties" dla opcji AutoPostBack ustaw wartość "True" (zrób tak dla każdego z trzech CheckBoxów).
Qba,
16 listopada 2007, 23:43
respect, podoba mi się bardzo, masz dobrze wytłumaczone, oby więcej takich stronek i ludzi którzy je tworzą
ziomek,
6 lutego 2008, 20:12
Line 21: if (this.TextBox3.Text != "")
Line 22: {
Line 23: totalCost += 20 * System.Convert.ToInt32(TextBox1.Text);
Line 24: }
Line 25: if (this.TextBox4.Text != "")
Chester,
20 lutego 2008, 12:49
dopiero po wcisnieciu wyslij mi sie pojawia aktywny TextBox do wpisania liczby egzemplarzy.ktos wie jak to poprawic?
olek,
27 maja 2008, 17:18
Chciałbym się podzielic tym, co zauważyłem. otóż próbowałem zrobic wiele razy pierwszy przykład zastosowania popularnych kontrolek (na stronie numer jeden, artykuł 03).
używając zwrotu:
protected void btnSubmit_Click(object sender, EventArgs e)
strona nie działa jak powinna. Nie wyświetlają się dane o użytkowniku, a text boxy pozostają wypełnione.
zadziałało mi dopiero z małą korektą:
protected void btnSubmit_Click1(object sender, EventArgs e)
Nie wiem dlaczego tak jest. czy ktoś ma podobny problem, lub zna odpowiedź dlaczego tak się dzieje ?
Noobek,
17 czerwca 2008, 18:19
we wlasciwosciach Checkboxa ustawcia wartosc Autopostback na true wtedy z zaznaczeniem automatycznie przejaldowuje strone, dziala to rowniez z innymi kontrolkami i bardzo sie przydaje
Marcel,
30 października 2008, 21:53
A wie ktoś jak zrobić ,żeby po odznaczeniu checkboxa znikal textbox??
rafał,
15 listopada 2008, 15:16
Do Noobek: Miałem to samo, tez jestem poczatkujący. Trzeba "związać" przycisk z metodą btnSubmit_Click w następujący sposób: Zaznaczyć przycisk i w oknie "Properties" nacisnąć przycisk z żółtą błyskawicą (Events). Tam we właściwości "Click" należy wybrać z listy metodę btnSubmit_Click
łysy,
16 listopada 2008, 12:17
Zamiast modyfkować metode Page_Load, można zrobic trzy metody (po dwukrotnym kliknięciu na CheckBoxy utworzy się szkielet):
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)<br />{<br /> TextBox3.Visible = CheckBox1.Checked;<br />}
takie podejście wraz z autoPostBack spowoduje chowanie sie textBoxow w zaleznosci od zaznaczonego checkBoxa.
Poohaty,
10 marca 2009, 16:25
Dokładnie . Jedynie co można się doczepić , to niech TextBox1.Visible = CheckBox1.Checked ; Ale to pierdoła. Bardzo dobry kurs .<br />
Saya,
30 lipca 2009, 17:25
Czyli jakby ktoś sie pogubił.
dla 3 checkboxów
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)<br /> {<br /> TextBox1.Visible = CheckBox1.Checked;<br /> }<br />oraz w properties ustawić autopostback = true, w zdarzeniach Load = CheckBox1_CheckedChanged
wtedy klika :)
xman,
13 września 2009, 11:00
Metoda TotalCost jest pod wzgklędme konserwacji i wydajnosci niezbyt dobrze napisana - Wyobraźcie sobie 500 tytułów - sprawdzanie kazego z 500 textboxów będzie błędem - zróbmy tak :
private Int32 TotalCost()
{
Int32 TotalIlosc = 0;
for (int i = 0; i < this.Form.Controls.Count - 1; i++)
{
if (this.Form.Controls.GetType().Name.CompareTo("TextBox") == 0)
{
TextBox T = (TextBox)this.Form.Controls;
if (T.Text == "")
T.Text = "0";
else
TotalIlosc = TotalIlosc + Convert.ToInt32(T.Text);
}
}
return TotalIlosc;
}
i w zdarzeniu Button1_Click1 :
Label4.Text =Convert.ToString(20*TotalCost());
Metoda totalCost nie ulegnie wydłużaniu w miare dodawania textboxów - oczywiscie metoda nie obsługuje kontroli nie wprowadzenia cyfry ale to kurs nie chodzi o wyjasnienie mechanizmu
Christoff,
28 września 2009, 08:25
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)<br />{<br /> TextBox3.Visible = CheckBox1.Checked;<br /> [size= x-small; color: #0000ff">[color=#0000ff"><font size="2" color="#0000ff">this
[/color">[color=#0000ff">
[/color">
}
jeśl dodamy to linijke po zniknieciu textboxa wcześniej wpisana wartość niebędzie się wliczała do totalcost.
[size= x-small">.TextBox3.Text = [/size">[size= x-small; color: #a31515">""[/size">
[size= x-small">; [/size">
Przemek,
30 listopada 2009, 14:22
Mi sie podoba ten kurs, poki trzymacie sie sztywno planu punkt po punkcie(po malu) to wszystko chodzi,wspoldziala,dziala jak nalezy;-)
Pozdro C#
Darius,
6 stycznia 2010, 03:59
Kurs dobry, dzieki...
Anonimous,
10 sierpnia 2010, 15:22
a ja to zrobiłem o wiele prościej i też działa
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void T_TextChanged(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
// if ((this.TextBox1.Text.Trim() == "") && (this.TextBox2.Text.Trim() == "") && (this.TextBox3.Text.Trim() == ""))
//{
// return -1;
//}
int totalCost = 0;
if (this.TextBox1.Text != "")
{
totalCost += 20 * System.Int32.Parse(this.TextBox1.Text);
}
if (this.TextBox2.Text != "")
{
totalCost += 20 * System.Int32.Parse(this.TextBox2.Text);
}
if (this.TextBox3.Text != "")
{
totalCost += 20 * System.Int32.Parse(this.TextBox3.Text);
}
this.lblResults.Text = "Użytkownik: " + this.tbName.Text + " "
+ this.tbSurname.Text + " do zapłaty = " + totalCost.ToString();
this.tbName.Text = "";
this.tbSurname.Text = "";
}
}
Moon84,
20 stycznia 2012, 14:55