2010-05-13 20 views
8

Tengo una página ASP simple con una grilla de datos (vinculada a una fuente de objeto). La cuadrícula está dentro de la página de un asistente y tiene una casilla de verificación 'seleccionar' para cada fila.GridView no recuerda el estado entre las devoluciones de datos

En una etapa del asistente, Ato GridView:

protected void Wizard1_NextButtonClick(object sender, WizardNavigationEventArgs e) 
    { 
... 
     // Bind and display matches 
     GridViewMatches.EnableViewState = true; 
     GridViewMatches.DataSource = getEmailRecipients(); 
     GridViewMatches.DataBind(); 

Y cuando se hace clic en el botón Finalizar, que iterar por las filas y comprobar lo que está seleccionado:

protected void Wizard1_FinishButtonClick(object sender, WizardNavigationEventArgs e) 
{ 
    // Set the selected values, depending on the checkboxes on the grid. 
    foreach (GridViewRow gr in GridViewMatches.Rows) 
    { 
     Int32 personID = Convert.ToInt32(gr.Cells[0].Text); 
     CheckBox selected = (CheckBox) gr.Cells[1].FindControl("CheckBoxSelectedToSend"); 

Pero al esta etapa GridViewMatches.Rows.Count = 0! No vuelvo a unir la red, no debería necesitar, ¿verdad? Espero que el estado de vista mantenga el estado. (Además, si vuelvo a vincular la cuadrícula, mis casillas de verificación de selección se borrarán)

NB: Esta página también agrega dinámicamente controles de usuario en el método OnInit. He oído que podría interferir con el estado de la vista, pero hasta donde sé, lo estoy haciendo correctamente y parece que el ViewState para esos controles agregados funciona (los valores se mantienen entre las devoluciones)

Muchas gracias ¡avance para cualquier ayuda!

Ryan

ACTUALIZACIÓN: ¿Podría ser esto que ver con el hecho de que soy la creación de la fuente de datos mediante programación? Me preguntaba si el motor asp estaba enlazando datos de la red durante el ciclo de vida de la página con una fuente de datos que aún no estaba definida. (En una página de prueba, el GridView está 'automáticamente' vinculado a datos '. No quiero volver a enlazar la red ¡Solo quiero los valores del viewstate de la publicación anterior!

Además, tengo esto en el cabecera asp: ViewStateEncryptionMode = "Nunca" - esto era resolver un mensaje de vez en cuando 'no válida Viewstate Validación MAC'

como referencia, mi GridView se define como sigue:

<asp:GridView ID="GridViewMatches" runat="server" AllowSorting="True" AutoGenerateColumns="False" 
    BackColor="White" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" CellPadding="3" 
    OnDataBinding="GridViewMatches_OnBinding"> 
     <Columns> 
      <asp:BoundField DataField="PersonID"><ItemStyle CssClass="hidden"/></asp:BoundField> 
      <asp:TemplateField> 
       <ItemTemplate> 
        <asp:CheckBox ID="CheckBoxSelectedToSend" runat="server" 
         Checked='<%# DataBinder.Eval(Container.DataItem, "SelectedToSend") %>'/> 
       </ItemTemplate> 
... 

Respuesta

9

Iterar los controles en el evento PreInit (para detectar si se presionó el botón 'agregar otro control' o 'quitar otro control') invalida el estado de la vista !!

Aquí es el método llamado de PreInit

public Control GetPostBackControl(Page thePage) 
    { 
     //return null; 

     Control myControl = null; 
     string ctrlName = thePage.Request.Params.Get("__EVENTTARGET"); 
     if (((ctrlName != null) & (ctrlName != string.Empty))) 
     { 
      myControl = thePage.Master.FindControl(ctrlName); 
     } 
     else 
     { 
      foreach (string Item in thePage.Request.Form) 
      { 
       Control c = thePage.Master.FindControl(Item); 
       if (((c) is System.Web.UI.WebControls.Button)) 
       { 
        myControl = c; 
       } 
      } 

     } 

     return myControl; 
    } 

(me da ningún crédito para este methd, lo encontré en la web)

Si la primera línea es sin comentar, se mantiene el estado de vista.

¡Horrible!

+2

Gracias. Gracias. Mil veces, gracias. Me salvaste un montón de dolor de cabeza. Por cierto, el mismo problema también ocurre en Page_Init. – jwd

2

Asegúrese de que su GridViewViewState está en de forma predeterminada.

Verifique que el GridView no se está recuperando ni borrando.

Si aún no funciona, marque cualquiera de los controles principales de su GridView y asegúrese de que su ViewState NO esté desactivado. Cualquier control principal con ViewState apagado hará que todos sus controles secundarios no utilicen ViewState.

Los controles dinámicos no deberían tener ningún impacto en su GridView a menos que su GridView esté dentro de uno de estos controles dinámicos.

+0

Hola, muchas gracias por su respuesta. Cambié la definición de GridView para habilitar Viewstate: EnableViewState = "True" y comprobé que vinculo la grilla en un solo lugar (el evento 'siguiente' del asistente). ¡Todavía no está funcionando! Viewstate está bien para otros controles en la misma página (en otros pasos del asistente). ¡Esto me está volviendo loco! – Ryan

1

¿Su gridview y otros controles tienen una identificación? Si no especifica una ID, o si la ID cambia entre las devoluciones, perderá los cambios de viewstate.

+0

¡Gran idea! Pero, por desgracia, tiene una identificación. He agregado la definición de mi GridView a la pregunta – Ryan

Cuestiones relacionadas