2009-10-13 12 views
7

Ho un modello di articolo ListView seguente, in cui sto tentando di associare il valore intero alla proprietà Checked di CheckBox.ASP.NET Binding integer al campo CheckBox

IsUploaded valore contiene solo 0 e 1 ...

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

Ma ASP.NET lamenta che

Dettagli eccezione: System.InvalidCastException: Sepcified cast non è valido

Anche se il seguente codice che utilizza DataBinder.Eval() funziona,
I nee d per avere un binding a 2 vie, quindi è necessario utilizzare Bind().

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

Come posso convertire i 0 e 1. a booleano utilizzando Bind()?


[RISPOSTA] Ho esteso tipo auto-generata attraverso classe parziale con l'aggiunta di una nuova proprietà menzionato nel answer by Justin

+0

Sta rendendo "IsUploaded" un bit o un altro tipo di dati booleano invece di un'opzione int? – kscott

+0

@kscott: "IsUploaded" è un po '. – Sung

+0

A quale tipo di datasource si sta vincolando? Associare una casella di controllo a un bit utilizzando una objectdatasource che punta a un adattatore di tabella funziona senza errori per me. – kscott

risposta

7

Se siete disposti a cambiare la classe, aggiungere una proprietà della classe che è un valore booleano

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

in caso contrario, si può avere successo con un TypeConverter:

  1. Creare un costume TypeConverter che gestirà 0 e 1 a conversioni booleani
  2. Stick il TypeConverterAttribute sulla proprietà IsUploaded per .NET diretto al tuo TypeConverter personalizzato.
3

ne dite di aggiungere una proprietà alla classe che fa la conversione?

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

e quindi associare a questa proprietà IsUploadedBool anziché direttamente alla INT sottostante.

Marc

+0

@marc_s: intendevi doppio "==" non "=" :) – Sung

+0

L'ho fatto - ovviamente - grazie! Aggiornato –

2

Tipo di un'opera formaggio intorno sarebbe quella di utilizzare un elenco a discesa con voci di elenco verso il basso per dare lo stesso effetto:

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

Scusiamo scott ma devo attenermi a "CheckBox" per il mio caso particolare. Ma grazie per avermi dato un'idea di questo. – Sung

+0

@kscott: Saresti in grado di modificare la tua risposta? (aggiungi un punto o ecc.) in modo da poter revocare la tua risposta? Considero la tua risposta come valida anche per il mio caso. Grazie. – Sung

1

ne dite (BTW sto usando una stored procedure)

pagina aspx

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

codice dietro

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

Soluzione:

Ciao, sto utilizzando anche la valutazione Ajax in un GridView e ho riscontrato questo problema. Dopo aver esaminato diversi forum, ho provato questo e ha funzionato per me. Spero che ti sia d'aiuto:

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

restituisce un numero intero, dal momento che stai utilizzando Controllato che è un numero intero.

Problemi correlati