2009-06-05 5 views
10

J'ai une page ASP.NET qui comporte deux éléments: entréeASP.NET AJAX Toolkit - CalendarExtender est remis à zéro Postback

  1. une zone de texte qui est en lecture seule. Cette zone de texte est le TargetControl d'un CalendarExtender
  2. A DropDownList avec AutoPostBack = true

Voici le code:

<table border="0" cellpadding="0" cellspacing="0"> 
    <tr><td colspan="2">Date:</td></tr> 
    <tr><td colspan="2"> 
    <asp:TextBox ID="dateTextBox" runat="server" ReadOnly="true" /> 
    <ajax:CalendarExtender ID="datePicker" runat="server" Format="MM/dd/yyyy" OnLoad="datePicker_Load" TargetControlID="dateTextBox" /> 
    </td></tr> 

    <tr><td colspan="2">Select an Option:</td></tr> 
    <tr> 
    <td>Name:&nbsp;</td> 
    <td><asp:DropDownList ID="optionsDropDownList" runat="server" AutoPostBack="true" 
     OnLoad="optionsDropDownList_Load" 
     OnSelectedIndexChanged="optionsDropDownList_SelectedIndexChanged" 
     DataTextField="Name" DataValueField="ID" /> 
    </td></tr> 

    <tr><td><asp:Button ID="saveButton" runat="server" Text="Save" OnClick="saveButton_Click" /></td></tr> 
</table> 

Lorsque les messages DropDownList arrière, la date sélectionnée par l'utilisateur avec le Datepicker est réinitialisé à la date actuelle. De plus, si je regarde la propriété Text de dateTextBox, elle est égale à string.Empty. Comment puis-je conserver la date sélectionnée par l'utilisateur sur un PostBack?

Répondre

9

Le fait que la zone de texte soit en lecture seule semble être à l'origine de ce problème. J'ai dupliqué votre problème en utilisant aucun code dans l'un des événements liés, et la date a encore disparu. Toutefois, lorsque j'ai modifié la zone de texte à ReadOnly = False, cela a fonctionné correctement. Avez-vous besoin d'avoir la zone de texte en lecture seule, ou pouvez-vous la désactiver ou valider la date saisie?

EDIT: OK, j'ai une réponse pour vous. Selon to this forum question, en lecture seule les contrôles ne sont pas postés sur le serveur. Ainsi, lorsque vous effectuez une publication, vous perdez la valeur dans un contrôle en lecture seule. Vous n'aurez pas besoin de lire le contrôle uniquement.

+3

Downvoting parce que je crois que la réponse de @ taeda est la vraie réponse à ce problème. –

0

Je soupçonne que votre datePicker_Load est en train de définir quelque chose et ne vérifie pas s'il s'agit d'une publication. Cela ferait en sorte que cela se produise à chaque fois et donnerait l'impression d'être «réinitialisé».

0

Au lieu de définir ReadOnly = "False", définissez Enabled = "False". Cela devrait résoudre votre problème.

+1

Ne fonctionne pas aussi loin que je peux voir - vous perdez toujours la valeur dans le champ désactivé sur la publication. – CodeClimber

3
protected void Page_Load(object sender, EventArgs e) 
{ 
    txt_sdate.Text = Request[txt_sdate.UniqueID]; 
} 
1

La solution au problème consiste à utiliser les collections Request.Form. Comme cette collection a des valeurs de tous les champs qui sont postés sur le serveur et aussi il a les valeurs qui sont définies en utilisant des scripts côté client comme JavaScript.

Ainsi, nous devons faire un petit changement dans la façon dont nous récupérons le côté serveur de valeur.

C#

protected void Submit(object sender, EventArgs e) 
{ 
    string date = Request.Form[txtDate.UniqueID]; 
} 
2

Si vous voulez le contenu de zone de texte se souvenaient après la postback et de garder toujours le contrôle en lecture seule, vous devez supprimer l'attribut lecture seule du balisage, et ajoutez ceci dans le codebehind pageload:

protected void Page_Load(object sender, EventArgs e){ 
    TextBox1.Attributes.Add("readonly", "readonly"); 
    // ... 
} 
12

Certes, vous devez faire comme d'autres l'ont déjà suggéré: définir dynamiquement champ readonly plutôt que dans le balisage, et assurez-vous que vous ne réinitialisez pas accidentellement la valeur Page_Load() pendant postbacks ...

...mais vous devez également effectuer les opérations suivantes à l'intérieur Page_Load(), parce que l'objet CalendarExtender a une copie interne de la date à laquelle doit être changé de force:

if (IsPostBack) // do this ONLY during postbacks 
{ 
    if (Request[txtDate.UniqueID] != null) 
    { 
     if (Request[txtDate.UniqueID].Length > 0) 
     { 
      txtDate.Text = Request[txtDate.UniqueID]; 
      txtDateExtender.SelectedDate = DateTime.Parse(Request[txtDate.UniqueID]); 
     } 
    } 
} 
+1

C'est la solution qui a fonctionné pour moi. J'ai essayé de faire ma zone de texte readonly = false et enableviewstate = true sans succès. Mais lorsque je définis manuellement la date sélectionnée par le contrôle du calendrier sur la date de la zone de texte, tout va bien et fonctionne correctement. –

-1

Il est pas un problème de la conservation, après mise enreadonly = true la valeur de la zone de texte particulier ne pas retourné au serveur si

Utilisez contentEditable="false" et faitreadonly = false

qui empêcherait la valeur est entrée autre que la sélection Calendar Extender renvoie également la valeur de la zone de texte Retour au serveur

0

@ réponse taeda travaillé pour moi. Pour info, si quelqu'un utilise enabled = "false" au lieu de readonly = "true" ne pourra pas utiliser cette réponse, car Request[TxtDate.UniqueId] lèvera une exception nulle.

Questions connexes