none
Comparer l'ancienne et la nouvelle valeur saisie dans un Textbox RRS feed

  • Question

  • Bonjour,

    J'aimerai savoir s'il existe comme en Winform, une propriété dans un <asp:textbox> pour y stocker une information!
    En winform, j'utilisais la propriété Tag (Obtient ou définit l'objet qui contient les données relatives au contrôle)!
    Apparement la propriété Tag n'existe pas :x.
    Y a-t'il une astuce a part le faire un champ hidden?

    mon but est de faire des insertions en base de ligne si et seulement si le contenu de mes textbox ont changé (sans avoir d'evenement onChamge())!

    Par exemple, j'ai 3 textbox pré-remplie, si j'en modifie 2, j'insere mes 2 enregistrement en base!

    ce que je voulais faire, c'etait mettre par dans la propriété maTextbox.Text="mavaleur" et dans maTextbox.Tag="mavaleur", si je saisi autre chose, je compare avec un if(maTextbox.Text != maTextbox.Tag{//insert en base}

    est ce que quelqu'un a une astuce pour faire ça?
    (autre qu'avec les champs hidden)

    merki
    vendredi 14 décembre 2007 13:22

Réponses

  • Bonjour,

    Effectivement il n'y a pas d'équivalent à la propriété Tag en ASP.Net. La seul possibilité pour pouvoir faire un test "ancienne valeur != nouvelle valeur" si vous ne voulez pas récupérer les valeurs depuis votre source est de les sauver dans la page.

    Par contre pas besoin de champs cachés, utilisé simplement le ViewState : "ViewState["text1"] = "maValeur";" puis pour le test : if ((string) ViewState["text1"] != maTextbox.Text) {...}

     

    Note technique :

    1. le ViewState est sauvé dans un champs caché mais il n'y a qu'un champs caché pour l'ensemble des données du ViewState et les données sont encodées (elles peuvent même être cryptées).
    2. on ne peut mettre dans le ViewState que des objets sérializables.
    3. Généralement on crée des propriétés autour des accès au ViewState pour plus de simplicité :

    Extrait de code

    public string TextOriginal1

    {

    get

    {

    object value = this.ViewState["TextOriginal1"];

    if (null != value)

    {

    // valeur sauvée

    return (string) value;

    }

     

    // valeur par défaut

    return string.Empty;

    }

    set

    {

    this.ViewState["TextOriginal1"] = value;

    }

    }

     

     

    Guillaume

    vendredi 14 décembre 2007 14:30

Toutes les réponses

  • Bonjour,

    Effectivement il n'y a pas d'équivalent à la propriété Tag en ASP.Net. La seul possibilité pour pouvoir faire un test "ancienne valeur != nouvelle valeur" si vous ne voulez pas récupérer les valeurs depuis votre source est de les sauver dans la page.

    Par contre pas besoin de champs cachés, utilisé simplement le ViewState : "ViewState["text1"] = "maValeur";" puis pour le test : if ((string) ViewState["text1"] != maTextbox.Text) {...}

     

    Note technique :

    1. le ViewState est sauvé dans un champs caché mais il n'y a qu'un champs caché pour l'ensemble des données du ViewState et les données sont encodées (elles peuvent même être cryptées).
    2. on ne peut mettre dans le ViewState que des objets sérializables.
    3. Généralement on crée des propriétés autour des accès au ViewState pour plus de simplicité :

    Extrait de code

    public string TextOriginal1

    {

    get

    {

    object value = this.ViewState["TextOriginal1"];

    if (null != value)

    {

    // valeur sauvée

    return (string) value;

    }

     

    // valeur par défaut

    return string.Empty;

    }

    set

    {

    this.ViewState["TextOriginal1"] = value;

    }

    }

     

     

    Guillaume

    vendredi 14 décembre 2007 14:30
  • Dommage pour le champ Tag :x il aurait été bien plus pratique!

    merki pour la solution, j'avais oublié le ViewState ^^
    vendredi 14 décembre 2007 14:34
  • Rien ne vous empêche si vous avez beaucoup de TextBox dans ce cas à faire un classe héritant de TextBox en lui ajoutant un propriété Tag (ou OriginalText) qui lira/sauvera sa valeur dans le ViewState automatiquement 

     

    vendredi 14 décembre 2007 14:49
  • et comment faire pour que Tag apparaisse dans mon code html?
    exemple :
    <asp:TextBox ID="txtChamp" runat="server" Text="maValeurOrigine"
    Tag="maValeurOrigine"></asp:TextBox>
    vendredi 14 décembre 2007 15:02
  • Si vous utilisez le code que vous donnez :

    <asp:TextBox ID="txtChamp" runat="server" Text="maValeurOrigine" Tag="maValeurOrigine"></asp:TextBox>

     

    Cela produit le code HTML suivant :

    <input name="txtChamp" type="text" value="maValeurOrigine" id="txtChamp" Tag="maValeurOrigine" />

     

    Donc Tag apparait déjà dans votre code HTML

    Si vous ne voulez PAS voir Tag, vous pouvez faire une classe custom :

     

    Extrait de code

    public class MyTextBox : TextBox

    {

    public object Tag

    {

    get

    {

    return this.ViewState["Tag"];

    }

    set

    {

    this.ViewState["Tag"] = value;

    }

    }

    }

     

     

    Guillaume
    vendredi 14 décembre 2007 16:02
  • je pourrais donc renseigner ma property Tag via ma balise <asp:Textbox> et y avoir acces ensuite dans le code behind?

    par ex:

    definir:
    <asp:TextBox ID="txtChamp" runat="server" Text="maValeurOrigine" Tag="maValeurOrigine"></asp:TextBox>

    et dans le code behing :

    string s = (string)
    txtChamp.tag;
    vendredi 14 décembre 2007 16:38
  • C'est presque ça. Le parser aspx, lorsqu'il ne trouve pas de propriété sur l'objet avec le nom spécifié, ajoute automatiquement cette propriété à la collection Attributes du WebControl. Cette collection ne prend par contre en valeur que des string.

    Donc dans le code behind il faudra faire :

     

    string s = txtChamp.Attributes["Tag"];

     

    Guillaume

    vendredi 14 décembre 2007 19:42