2010-03-25 18 views
5

Ho una proprietà int? MyProperty come membro nella mia origine dati (ObjectDataSource). Posso associare ad un TextBox, comeAssociazione di un int nullo a un asp: TextBox

<asp:TextBox ID="MyTextBox" runat="server" Text='<%# Bind("MyProperty") %>' /> 

Fondamentalmente voglio ottenere un valore null visualizzato come vuoto "" nel controllo TextBox, e un numero come un numero. Se il TextBox è vuoto, MyProperty deve essere impostato su null. Se il TextBox ha un numero in esso, MyProperty deve essere impostato su questo numero.

Se lo provo, ottengo un'eccezione: "Vuoto non è un Int32 valido".

Ma come posso farlo? Come lavorare con le proprietà nullable e Bind?

Grazie in anticipo!

risposta

1
<asp:TextBox ID="MyTextBox" runat="server" 

Text='<%# Bind("MyProperty").HasValue ? Bind("MyProperty") : "" %>' /> 

È possibile utilizzare HasValue per determinare se il tipo nullable è null e quindi impostare la proprietà Text.

+2

Grazie per la risposta, enduro. Ma questo non funziona affatto e nemmeno si compila. Funzionerebbe con Eval (almeno dopo aver lanciato il ritorno di Eval su int?) Ma Bind è tutta un'altra storia. – Slauma

2

Sto iniziando a credere che non sia possibile associare una proprietà valore nullable. Til ora posso solo vedere la soluzione per aggiungere una proprietà di supporto aggiuntivo per associare un tipo nullable:

public int? MyProperty { get; set; } 

public string MyBindableProperty 
{ 
    get 
    { 
     if (MyProperty.HasValue) 
      return string.Format("{0}", MyProperty); 
     else 
      return string.Empty; 
    } 

    set 
    { 
     if (string.IsNullOrEmpty(value)) 
      MyProperty = null; 
     else 
      MyProperty = int.Parse(value); 
      // value should be validated before to be an int 
    } 
} 

e quindi associare la proprietà di supporto per il controllo TextBox al posto dell'originale:

<asp:TextBox ID="MyTextBox" runat="server" 
    Text='<%# Bind("MyBindableProperty") %>' /> 

I' essere felice di vedere un'altra soluzione.

+0

Questo non funziona in un 'FormView' dove l'origine dati è un 'EntityDataSource' - Ho appena ottenuto' DataBinding:' System.Web.UI.WebControls.EntityDataSourceWrapper 'non contiene una proprietà con il nome' MyBindableProperty '. ' – Rich

4

Bene, ho trovato una soluzione, che include tuttavia un FormView e non si specifica se ciò si adatta al proprio scenario.

In ogni caso, nel mio caso l'entità DataBound è un mio dto (non che dovrebbe avere importanza) e il trucco è che quando si aggiorna il formview si deve essenzialmente allegare all'evento pre-databound e -Scrivi la stringa vuota come un valore nullo in modo che il quadro possa struttura iniettare il valore per l'oggetto costruito:

protected void myFormView_Updating(object sender, FormViewUpdateEventArgs e) 
{ 
    if (string.Empty.Equals(e.NewValues["MyProperty"])) 
     e.NewValues["MyProperty"] = null; 
} 

e simile a inserto

protected void myFormView_Inserting(object sender, FormViewInsertEventArgs e) 
{ 
    if (string.Empty.Equals(e.Values["MyProperty"])) 
     e.Values["MyProperty"] = null; 
} 

ciò che rende questo davvero divertimento è il fatto che th Il messaggio di errore (non è un Int32 valido) è in realtà sbagliato e dovrebbe scrivere (non è un Nullable valido), ma allora nullables sarebbe stato cittadino di prima classe, no?

Problemi correlati