2010-03-25 8 views
5

J'ai une propriété int? MyProperty en tant que membre dans ma source de données (ObjectDataSource). Puis-je lier à un TextBox, commeLiaison d'un int nullable à un ASP: TextBox

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

Fondamentalement, je veux obtenir une valeur null affichée en blanc "" dans la zone de texte et un numéro comme numéro. Si le TextBox est vide, MyProperty doit être défini sur null. Si le TextBox contient un nombre, MyProperty doit être défini sur ce nombre. Si je l'essaie, je reçois une exception: "Blank n'est pas un Int32 valide".

Mais comment puis-je faire cela? Comment travailler avec des propriétés nullables et Bind?

Merci d'avance!

Répondre

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

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

Vous pouvez utiliser HasValue pour déterminer si le type Nullable est nulle, puis définissez la propriété Text.

+2

Merci pour la réponse, enduro. Mais cela ne fonctionne pas du tout et ne compile même pas. Cela fonctionnerait avec Eval (au moins après avoir renvoyé Eval à int?) Mais Bind est une toute autre histoire. – Slauma

2

Je commence à croire qu'il n'est pas possible de lier une propriété de valeur NULL. Jusqu'à maintenant, je ne peux voir la solution de contournement pour ajouter une propriété d'aide supplémentaire pour lier un type 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 
    } 
} 

et lier ensuite la propriété d'aide à la zone de texte au lieu de l'original:

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

Je d être heureux de voir une autre solution.

+0

Cela ne fonctionne pas à l'intérieur d'un 'FormView' où la source de données est un 'EntityDataSource' - je viens d'obtenir' DataBinding:' System.Web.UI.WebControls.EntityDataSourceWrapper 'ne contient pas une propriété avec le nom' MyBindableProperty '. ' – Rich

4

Eh bien, j'ai trouvé une solution, qui comprend un formulaire mais vous ne spécifiez pas si cela correspond à votre scénario. De toute façon, dans mon cas, l'entité DataBound-ed est un dto de mon propre (pas que cela devrait importer) et l'astuce est que lorsque vous mettez à jour le formulaire, vous devez essentiellement attacher sur l'événement pre-databound et re -WRITE la chaîne vide comme une valeur nulle de sorte que le cadre peut bien injecter la valeur à l'objet construit:

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

et de même sur insert

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

ce qui rend ce vraiment amusant est le fait que Le message d'erreur (n'est pas un Int32 valide) est réellement faux et il devrait écrire (Nullable n'est pas valide) mais alors les nullables auraient été des citoyens de première classe, n'est-ce pas?

Questions connexes