2009-11-18 17 views
7

Tengo un GridView que tiene un DataSourceID apuntando a un ObjectDataSource. ObjectDataSource apunta a un método que devuelve un LINQ IQueryable utilizando las propiedades TypeName, SelectMethod y SelectCountMethod del control ObjectDataSource. Lo que ocurre es que los datos se cargan correctamente por adelantado. Sin embargo, en la devolución de datos, si elimino las filas de GridView y trato de volver a enlazar con el explícito GridView.DataBind(), no funciona. Sé que LINQ está devolviendo el recuento de filas correcto y tal porque he llamado al método de conteo y devuelve el recuento de filas correcto. Aquí hay un ejemplo rápido:GridView no se vuelve a vincular correctamente después de la devolución

<asp:GridView ID="TestGridView" runat="server" PageSize="20" 
    AutoGenerateColumns="false" AllowPaging="true" 
    AllowSorting="false" DataSourceID="TestDataSource"> 
    <Columns> 
     ... 
    </Columns> 
</asp:GridView> 

<asp:ObjectDataSource ID="TestDataSource" runat="server" 
    EnablePaging="true" SelectCountMethod="GetDetailCount" 
    SelectMethod="GetDetails" TypeName="MyApp.PageClass" /> 

He intentado añadir un botón y añadiendo el TestGridView.DataBind(); método para eso. Intenté agregarlo al evento Page_PreRender. No importa lo que intento, no está funcionando.

Como alguien sugirió a continuación, he intentado moverlo a Page_Load también, y no ir. He aquí un ejemplo aproximado de mi código:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     // Set "initial" query parameters, then ... 
     BindData(); 
    } 
} 

private void BindData() 
{ 
    // EDITED: Removed the code below since I'm not looking to delete the 
    //   rows from the database, but rather get the GridView to rebind 
    //   which its not. 
    ////Remove all current rows from the GridView 
    //int colCount = TestGridView.Rows.Count; 
    //for (int x = 1; x <= colCount; x++) 
    //{ 
    // TestGridView.DeleteRow(x); 
    //} 

    // Bind GridView to the ObjectDataSource 
    TestGridView.DataBind(); 
} 

protected void RegenerateImageButton_Click(object sender, ImageClickEventArgs e) 
{ 
    // Set "updated" query parameters, then ... 
    BindData(); 
} 
+0

Modificó lo anterior nuevamente. –

Respuesta

0

Después de mirar en el código detrás de un poco más, tropecé con los valores de propiedad de la página almacenados en ViewState. Una vez que lo cambié a Sesión, funcionan.

+6

Si explica eso con un poco más de detalle, tendré la tentación de hacer +1 en su solución. ;) –

3

idea tonta, pero ¿ha comprobado el evento de carga de página con el if(!Page.IsPostBack)?

De ASP.NET Page Framework Overview:

Load: Durante este evento, se puede realizar una serie de acciones a cualquiera crear su página ASP.NET por primera vez o para responder a los eventos del cliente que resultan de una publicación. La página y el estado de la vista de control se han restaurado antes de este evento. Use la propiedad de la página IsPostBack para verificar si es la primera vez que se procesa la página. Si es la primera vez, realice el enlace de datos. Además, lea y actualice las propiedades de control.

Donde como

Page_PreRender: El evento PreRender se dispara justo antes de que el estado de vista se guarda y los controles son prestados. Puede usar este evento para realizar cualquier operación de último minuto en sus controles.

En efecto

Debido a que el marco de página es un estado y un modelo desconectado, cada vez que un cliente solicita una página .aspx, muchas cosas ocurren durante el procesamiento de la página ...

Por lo tanto, en efecto, podría estar haciendo su verificación antes de que se configure el viewstate en lugar de después de que se haya restaurado viewstate. El lugar más común para comprobar if(!Page.IsPostBack) normalmente está en el evento Page_Load.

+0

Sí. Mire debajo del código de ejemplo anterior: "He intentado agregar un botón y agregar el método TestGridView.DataBind() a eso. He intentado agregarlo al evento Page_PreRender. No importa lo que intento, no está funcionando". –

+0

Sí, incluso en el evento Page_Load no funciona. –

+0

Código actualizado para mostrarle lo que estoy haciendo. –

2

Su ejemplo muestra

TestGridView.Columns.RemoveAt(0); 

pero que realmente significa

TestGridView.Rows.RemoveAt(0); 

(y es este el problema?)

+0

Wow. Gracias Jeff. Eso ayuda, pero no resuelve mi problema. –

2

He tenido un problema similar con dinámicamente vinculante un TreeView a una XmlDataSource que cambió la fuente xml en cada devolución.Al establecer EnableCache en falso, se solucionó. ¿Has probado esto? (Tenga en cuenta el objeto Linq2Sql ya se almacena en caché, si su IQueryable está utilizando un objeto Linq2Sql, es decir)

<asp:ObjectDataSource ID="TestDataSource" runat="server" EnableCaching="false" 
    EnablePaging="true" SelectCountMethod="GetDetailCount" 
    SelectMethod="GetDetails" TypeName="MyApp.PageClass" /> 

si eso no funciona, intente esto unido a lo anterior:

protected override void OnPreRender(EventArgs e) 
{ 
    base.OnPreRender(e); 
    BindData(); 
} 
+0

No. Sigue sin funcionar. ¡Gracias! –

+0

Gracias, pero creo que lo tengo. Cuestión totalmente no relacionada. –

13

Las vistas de cuadrícula no se vuelven a enlazar en la devolución de datos, sus filas se alejan de viewstate. Restablecer el DatasourceID de gridview a la ID del origen de datos del objeto en la carga de la página (¿o init?) Provocará que la vista en cuadrícula sea rebotada.

+0

Sí, ¡excelente respuesta! – Petras

+0

funcionó para mí .... gracias –

+1

Muy buena explicación, pero si el problema es el ViewState, la forma correcta de resolverlo es agregar EnableViewState = "false" a su GridView. – Trajan

0

Tuve una situación similar en la que no se mostraban los valores actualizados de una fila, sin importar cómo intenté la conexión de datos después de la actualización.

El GridView se une a un ObjectDataSource, y se produjo el problema después de que cambié su objeto respaldo de una DataSet a un Entity Framework consulta

Activación ViewState para la GridView hizo el truco para mí, por lo tanto:

<asp:GridView ID="GridViewTransporters" PageSize="100" 
runat="server" AllowPaging="True" AllowSorting="True" 
AutoGenerateColumns="False" DataSourceID="ObjectDataSourceTransporters" 
DataKeyNames="Id" EnableViewState="True"> 
Cuestiones relacionadas