2009-10-13 5 views
7

Mam następujący szablon elementu ListView, w którym próbuję powiązać wartość całkowitą z Checked właściwością CheckBox.Liczba całkowita powiązana ASP.NET z polem CheckBox

IsUploaded wartość zawiera tylko 0 i 1 ...

<asp:ListView ID="trustListView" runat="server"> 
    <ItemTemplate> 
     <asp:CheckBox ID="isUploadedCheckBox" runat="server" 
      Checked='<%# Bind("IsUploaded") %>' /> 
    </ItemTemplate> 
</asp:ListView> 

Ale ASP.NET zarzuca

Szczegóły wyjątek: System.InvalidCastException: Sepcified obsada nie jest ważna

Mimo że kod działający pod DataBinder.Eval() działa,
I nee d mieć wiązanie dwukierunkowe, dlatego należy użyć Bind().

<asp:CheckBox ID="isUploadedCheckBox2" runat="server" 
    Checked='<%# Convert.ToBoolean(
     DataBinder.Eval(Container.DataItem, "IsUploaded"))) %>' /> 

Jak mogę przekonwertować 0 i 1 do boolean użyciu Bind()?


[ODPOWIEDŹ] mam przedłużony automatycznie wygenerowane przez typ częściowego klasy dodając nową właściwość wymienionego w answer by Justin

+0

Czy "IsUploaded" jest bitem lub innym boolowskim typem danych zamiast int opcja? – kscott

+0

@kscott: "IsUploaded" jest trochę. – Sung

+0

Jakie źródło danych wiążą Państwo? Wiązanie pola wyboru do bitu przy użyciu źródła danych obiektu wskazującego adapter tabeli działa bez żadnych błędów dla mnie. – kscott

Odpowiedz

7

Jeśli jesteś gotów do zmiany klasy, dodać właściwość na klasy, która jest logiczna

public bool IsUploadedBoolean 
{ 
    get { return IsUploaded != 0; } 
    set { IsUploaded = value ? 1 : 0; } 
} 

Jeśli nie, być może trzeba będzie sukces z TypeConverter:

  1. Tworzenie niestandardowego TypeConverter który zajmie 0 i 1 do logicznych konwersji
  2. Przyklej TypeConverterAttribute na posesji IsUploaded aby kierować .NET do niestandardowego TypeConverter.
3

Jak o dodanie obiekt do swojej klasy, która robi konwersję?

public bool IsUploadedBool 
{ 
    get { return IsUploaded == 1; } 
} 

a następnie wiążą się z tym IsUploadedBool własności zamiast bezpośrednio do leżącej INT.

Marc

+0

@marc_s: Miałeś na myśli podwójne "==", nie "=" :) – Sung

+0

Zrobiłem - oczywiście - dzięki! Zaktualizowany –

2

Rodzaju serowy pracy wokół byłoby użyć rozwijaną listę z elementów listy w dół dać taki sam efekt:

<asp:DropDownList ID="ddlBool" runat="server" SelectedValue= '<%# Bind("IsUploaded") %>'> 
    <asp:ListItem Text="True" Value="1" /> 
    <asp:ListItem Text="False" Value="0" /> 
</asp:DropDownList> 
+0

Przepraszamy Scotta, ale muszę trzymać się "CheckBox" dla mojego konkretnego przypadku. Ale dziękuję za udzielenie mi wglądu w to. – Sung

+0

@kscott: Czy mógłbyś zmienić odpowiedź? (dodaj kropkę lub itp.), abym mógł odpowiedzieć na twoją odpowiedź? Uważam, że twoja odpowiedź jest również ważną opcją w moim przypadku. Dzięki. – Sung

1

Jak o (btw używam procedura przechowywana)

aspx strony

<asp:CheckBox ID="social_facebook" runat="server" Checked='<%# Bind("True") %>' />Facebook 

kodu za

cmd.Parameters.Add("@p_facebook", SqlDbType.Bit).Value = social_facebook.Checked; 
0

Rozwiązanie:

Witam, używam również oceny Ajax w GridView i wpadłem na ten problem. Po przejrzeniu kilku forów spróbowałem tego i zadziałało to dla mnie. Mam nadzieję, że to pomaga:

<%# Convert.ToInt32(Eval("EVALUATION")) %> 

zwraca liczbę całkowitą, ponieważ używasz sprawdzone która jest liczbą całkowitą.