2009-06-05 15 views
10

Tengo una página ASP.NET que tiene dos elementos de entrada:ASP.NET AJAX Toolkit - CalendarExtender se restablece en devolución de datos

  1. un cuadro de texto que es de sólo lectura. Este cuadro de texto es la TargetControl de un CalendarExtender
  2. A DropDownList con AutoPostBack = true

Aquí está el código:

<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> 

Cuando los mensajes DropDownList espalda, la fecha seleccionada por el usuario con el selector de fechas se restablece a la fecha actual. Además, si miro la propiedad Text de dateTextBox, es igual a string.Empty.

¿Cómo conservo la fecha que el usuario seleccionó en un PostBack?

Respuesta

9

El hecho de que el cuadro de texto sea de solo lectura parece estar causando este problema. Dupliqué tu problema sin código en ninguno de los eventos enlazados, y la fecha aún desapareció. Sin embargo, cuando cambié el cuadro de texto a ReadOnly = False, funcionó bien. ¿Necesita que el cuadro de texto sea de solo lectura o puede deshabilitarlo o validar la fecha que se ingresa?

EDITAR: OK, tengo una respuesta para usted. Según to this forum question,, los controles de solo lectura no se publican en el servidor. Entonces, cuando haces una devolución de datos, perderás el valor en un control de solo lectura. No deberá hacer que el control sea de solo lectura.

+3

Downvoting porque creo que la respuesta de @ taeda es la verdadera respuesta a este problema. –

0

Sospecho que su fechaPicker_Load está configurando algo y no comprobando si está en una devolución de datos. Eso haría que suceda cada vez y se vea como si estuviera 'reiniciando'.

0

En lugar de establecer ReadOnly = "False", establezca Enabled = "False". Esto debería solucionar tu problema.

+1

No funciona tan lejos como puedo ver, aún pierde el valor en el campo deshabilitado en la devolución de datos. – CodeClimber

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

La solución al problema está haciendo uso de las colecciones Request.Form. Como esta colección tiene valores de todos los campos que se publican en el servidor y también tiene los valores que se establecen utilizando scripts del lado del cliente como JavaScript.

Por lo tanto, tenemos que hacer un pequeño cambio en la forma en que estamos buscando el lado del servidor de valor.

C#

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

Si desea que los contenidos de cuadro de texto recordados después de la devolución de datos y todavía mantienen el control como de sólo lectura, entonces usted tiene que quitar el atributo de sólo lectura del marcado, y añadir esta en el pageload código subyacente:

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

Ciertamente, usted debe hacer lo que otros ya han sugerido: juego de readonly campo dinámicamente en lugar de en el marcado, y asegúrese de que no está reposicionando un valor accidentalmente en Page_Load() durante las devoluciones de datos ...

...pero también se debe hacer lo siguiente dentro de Page_Load(), porque el objeto CalendarExtender tiene una copia interna de la fecha en que debe ser la fuerza cambió:

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

Esta es la solución que funcionó para mí. Intenté hacer que mi cuadro de texto fuera solo = falso y enableviewstate = verdadero sin éxito. Pero cuando configuro manualmente la fecha seleccionada del control de calendario a la fecha del cuadro de texto, todo está bien y funciona correctamente. –

-1

No es un problema de la conservación, después de establecerreadonly = true el valor de el cuadro de texto en particular no se devuelve de nuevo al servidor por lo

uso contentEditable="false" y hizoreadonly = false

que impediría que se ingrese el valor que no sea la selección de Extensor de calendario también devuelve el valor del cuadro de texto al servidor

0

La respuesta de @taeda funcionó para mí. FYI, si alguien usa enabled = "false" en lugar de readonly = "true" no podrá usar esa respuesta, porque Request[TxtDate.UniqueId] lanzará una excepción nula.

Cuestiones relacionadas