2010-09-23 11 views

Odpowiedz

12

Linia po prostu rzuca sender na CheckBox.

Dlaczego?

Podpis obsługi zdarzeń dla zdarzenia CheckedChanged jest:

CheckChanged(object sender, EventArgs e) 

Tak, trzeba rzucić sender powrotem do CheckBox jeśli chcesz używać CheckBox specyficzną funkcjonalność - object nie ma dużo, że ciebie można użyć ...

W ten sposób można użyć zmiennej checkbox, aby uzyskać identyfikator pola wyboru i działać w polu wyboru.

3

Zakładam definicja metoda jest mniej więcej tak:

void checkBox1_CheckedChanged(object sender,EventArgs e){ 
    CheckBox checkbox = (CheckBox)sender; 
    //.... 
} 

Zasadniczo co robią tutaj jest odlanie sender zmienną, która jest zadeklarowana jako jedynego obiektu ogólnego do (o wiele bardziej „użyteczne”) CheckBox zmienna.

Jest to zwykle robione, ponieważ trzeba rzutować, aby uzyskać dostęp do "konkretnych" właściwości CheckBox.

Na przykład

sender.Checked=true; 

nie będzie działać. Trzeba by to zrobić:

((CheckBox)sender).Checked=true; 

co oczywiście jest bardzo brzydki, więc jest dużo łatwiej zadeklarować nową zmienną wyboru i wtedy można po prostu zrobić

checkbox.Checked=true; 

bez odlewania.

1

Parametr sender (zadeklarowany jako zwykły Object) jest przesyłany do CheckBox, ponieważ najwyraźniej wiadomo, że nadawcą tego zdarzenia jest zawsze CheckBox.

+0

Chciałabym +1 ci jeszcze raz za korzystanie z „pozornie” :) – xtofl

1

Jak mówi Oded, potrzebny jest rzut z powodu sygnatury procedury obsługi zdarzeń.

Ty mógł użycie checkBox1 w obsłudze zdarzenia zamiast na typecast, ale do czynienia z sender można ponownie wykorzystać CheckChanged logiki dla innych kontroli, a także - choć w tym przypadku należy refactored w coś razem linie:

private void MyFancyCheckChanged(CheckBox sender, EventArgs e) 
{ 
    // do stuff 
} 

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    MyFancyCheckChanged((CheckBox) sender, e); 
} 
+0

Nie wszystko zdobyte w ten sposób. Wszystko, co zrobiłeś, to ustawić stół dla magazynu spaghetti. –

+1

@Joel: jeśli chodzi o ekstrakcję metody, to zależy to od tego, czy kod rzeczywiście * jest * ogólnego użytku - w takim przypadku prawdopodobnie powinien być również wyrzucony z klasy i umieszczony gdzieś bardziej odpowiedni. – snemarch

5

Oto example.Suppose w Gridview lub Repeater chcemy wybrać wszystkie option.As widzieliście na swojej skrzynce pocztowej.Tam jedno pole wyboru, jeśli klikniesz na to wszystko, wybierze. Kod lepiej ci wyjaśni.

protected void ChkAll_CheckedChanged(object sender, EventArgs e) 
{ 
    foreach (RepeaterItem rowItem in this.rptFriendsRecord.Items) 
    { 
     CheckBox chk = (CheckBox)rowItem.FindControl("cbFriend"); 
     chk.Checked = ((CheckBox)sender).Checked; 
    } 
} 

Mam nadzieję, że to działa.

0

Klasa CheckBox przedstawia pole wyboru, które użytkownicy mogą wybierać i usuwać. W tym temacie przedstawiono kontrolkę CheckBox w programie Windows Presentation Foundation (WPF) i opisano sposób tworzenia elementów CheckBox w języku Extensible Application Markup Language (XAML) i C#, ustawianie procedur obsługi zdarzeń w języku C#, tworzenie formantów CheckBox zawierających bogate treści, takie jak obrazy, i użyj stylizacji, aby zmienić wygląd kontrolki. Tutaj podałem próbkę dla ciebie.

<asp:CheckBox ID="CheckBox1" runat="server" Text="www.google.com" 
    OnCheckedChanged="CheckBox1_CheckedChanged" /> 
<asp:CheckBox ID="CheckBox2" runat="server" Text="www.yahoo.com" /> 

kod związany kod jest

protected void CheckBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    if (CheckBox1.Checked) 
     Response.Redirect("www.google.com"); 
    else 
     Response.Redirect("www.yahoo.com"); 
}