2010-07-23 24 views
7

Tengo un botón en mi página ASP.NET, que recupera algunos datos de mi base de datos y los muestra en una vista de cuadrícula.Problemas al utilizar UpdateProgress

Este proceso lleva tiempo, así que pensé en agregar un control AJAX de progreso de actualización. Ahora, cuando hago clic en el botón, aparece la imagen de progreso de actualización y los datos se obtienen de mi base de datos con éxito (lo comprobé en algunos registros que tengo en mi base de datos). Pero hay 2 problemas:

(1) La imagen del progreso de la actualización se muestra solo durante unos 2 minutos. Pero mi evento de clic de botón tarda unos 5 minutos en completarse. Básicamente, el progreso de actualización deja de aparecer incluso antes de que se complete mi tarea, lo que frustra su propósito.

(2) GridView no aparece. Se muestra correctamente si no uso scriptmanager/AJAX.

¿Alguna idea?

Algunos fragmentos de código relevantes:

<div style="position: absolute; top: 300px; left: 19px; width: 568px; height: 48px;"> 
    <table> 
     <tr> 
     <td> 
    <asp:Button ID="btnGenerateReport" runat="server" Height="37px" Text="Generate Report" 
     Width="132px" onclick="btnGenerateReport_Click" /> 
     </td> 
     <td class="style5"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server" /> 
    <asp:UpdatePanel runat="server" id="Panel"> 
    <ContentTemplate> 
      <asp:UpdateProgress ID="PageUpdateProgress" runat="server"> 
       <ProgressTemplate> 
        <img runat="server" src="updateprogress.gif" 
         style="position: static; width: 32px;"> </img></ProgressTemplate> 
      </asp:UpdateProgress> 
      <div style="position: absolute; top: 423px; left: 9px; width: 795px; height: 984px;"> 
     <asp:GridView ID="Report" runat="server" 
      AllowSorting="True" AutoGenerateColumns="False" 
      Height="622px" BorderStyle="Solid" 
      Width="779px" PageSize="100" HorizontalAlign="Center"> 
      <Columns> 
       <asp:BoundField HeaderText="AccountId" DataField="AccountId"> 
       <ControlStyle BorderStyle="Solid" Width="20px" /> 
       </asp:BoundField> 
       <asp:BoundField HeaderText="User Name" ReadOnly="True" DataField="UserName"> 
       <ControlStyle Width="50px" /> 
       </asp:BoundField> 
       <asp:BoundField HeaderText="C2" ReadOnly="True" 
        DataField="C2"> 
       <ControlStyle BorderStyle="Solid" Width="20px" /> 
       </asp:BoundField> 
       <asp:BoundField HeaderText="C1" ReadOnly="True" 
        DataField="C1"> 
       <ControlStyle BorderStyle="Solid" Width="20px" /> 
       </asp:BoundField> 
      </Columns> 
     </asp:GridView> 
    </div> 
    </ContentTemplate> 
    <Triggers> 
      <asp:AsyncPostBackTrigger ControlID="btnGenerateReport" EventName="click" /> 
    </Triggers> 
    </asp:UpdatePanel> 
     </td> 
     <td> 
     <asp:Button ID="btnExportToExcel" runat="server" Text="Export To Excel" 
       Height="37px" Width="132px" onclick="btnExportToExcel_Click" /> 
     </td> 
     </tr> 
    </table> 
    </div> 

CodeFile parte:

protected void btnGenerateReport_Click(object sender, EventArgs e) 
     { 

      FetchAccounts(); 
      long startId = FetchAuditData(); 
      AggregateAuditData(startId); 
      dsAnalysisReport = GenerateDataSet(); 
      if (dsAnalysisReport == null || dsAnalysisReport.Tables.Count == 0) 
       lblErrorText.Text = "No Data Found for the input information"; 
      else 
       BindData(dsAnalysisReport); 
     } 

     public void FetchAccounts() 
     { 
      using (var sqlConnection = new SqlConnection(ConnectionString)) 
      { 
       sqlConnection.Open(); 
       cmdstring = @"[spo_FetchAccounts]"; 
       cmd = new SqlCommand(cmdstring, sqlConnection) { CommandType = CommandType.StoredProcedure }; 
       cmd.CommandTimeout = 100000; 
       cmd.Parameters.Add("@MaxActivationDate", SqlDbType.DateTime); 
       cmd.Parameters["@MaxActivationDate"].Value = 
        DateTime.Parse(txtStartDate.Text) - new TimeSpan(1, 0, 0, 0); 
       cmd.ExecuteNonQuery(); 
       sqlConnection.Close(); 
      } 
     } 

     public long FetchAuditData() 
     { 
      using (var sqlConnection = new SqlConnection(ConnectionString)) 
      { 
       sqlConnection.Open(); 
       cmdstring = @"[spo_GetComparisonData]"; 
       cmd = new SqlCommand(cmdstring, sqlConnection) { CommandType = CommandType.StoredProcedure }; 
       cmd.CommandTimeout = 100000; 
       cmd.Parameters.Add("@StartDate", SqlDbType.DateTime); 
       cmd.Parameters["@StartDate"].Value = txtStartDate.Text; 
       cmd.Parameters.Add("@EndDate", SqlDbType.DateTime); 
       cmd.Parameters["@EndDate"].Value = txtEndDate.Text; 
       SqlParameter returnValue = new SqlParameter("@Return_Value", SqlDbType.BigInt); 
       returnValue.Direction = ParameterDirection.ReturnValue; 
       cmd.Parameters.Add(returnValue); 
       cmd.ExecuteNonQuery(); 
       long startId = long.Parse(cmd.Parameters["@Return_Value"].Value.ToString()); 
       sqlConnection.Close(); 
       return startId; 
      } 
     } 

     private void AggregateAuditData(long startId) 
     { 
      using (var sqlConnection = new SqlConnection(ConnectionString)) 
      { 
       sqlConnection.Open(); 
       cmdstring = @"[spo_ComparisonTable]"; 
       cmd = new SqlCommand(cmdstring, sqlConnection) { CommandType = CommandType.StoredProcedure }; 
       cmd.CommandTimeout = 100000; 
       cmd.Parameters.Add("@StartId", SqlDbType.Int); 
       cmd.Parameters["@StartId"].Value = startId; 
       cmd.ExecuteNonQuery(); 
       sqlConnection.Close(); 
      } 
     } 


     public DataSet GenerateDataSet() 
     { 

      using (var sqlConnection = new SqlConnection(ConnectionString)) 
      { 
       sqlConnection.Open(); 
       cmdstring = @"SELECT * FROM XAccounts"; 
       cmd = new SqlCommand(cmdstring, sqlConnection); 
       DataSet ds = new DataSet(); 
       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       da.Fill(ds); 
       sqlConnection.Close(); 
       if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) 
        return ds; 
       return null; 
      }  
     } 

     private void BindData(DataSet ds) 
     { 
      BindReportGrid(Report, ds.Tables[0]); 
     } 

     private void BindReportGrid(GridView gridToBind, DataTable dataTableToBind) 
     { 
      gridToBind.DataSource = dataTableToBind; 
      gridToBind.DataBind(); 
     } 
+0

Por favor muéstranos un código. –

Respuesta

12

Según el problema (1) lo más probable es que ajax se agote. El tiempo de espera predeterminado es de 90 segundos. Para aumentar que el uso de la propiedad AsyncPostBackTimeout ScriptManager:

<asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="400"> 
</asp:ScriptManager> 

Si la llamada Ajax es el tiempo de espera, controles de la página no funcionen correctamente con lo que aumenta el tiempo de espera podrían resolver el problema (2) también.

+1

Lo intentaré la próxima vez que enfrente un problema de este tipo. Este proyecto está listo por el momento. Pero esto parece ser más razonable porque noté que el progreso de la actualización se dispara después de aproximadamente 90 s. Así que lo marcaré como la respuesta ... ¡salud! –

+1

Esto funcionó para mí :) – Shanna

+0

funcionó para mí también gracias hermano :) –

0

parece que su red está fuera del panel de actualización, si está utilizando un panel de actualización y que el botón se encuentra dentro de la actualización el panel y la cuadrícula están fuera del panel de actualización, en ese caso todo sucederá en el servidor, pero no encontrará ningún cambio en la interfaz de usuario.

Intenta colocar la cuadrícula dentro del panel de actualización.

+0

No ... todavía no aparece. Tengo mi botón fuera del UpdatePanel y estoy usando un desencadenador Asyncpostback –

2

He tenido los mismos problemas con ASP.NET UpdateProgress. Lo arreglé manejando directamente los eventos del gestor de guiones:

<script language="javascript" type="text/javascript"> 

//adding event handlers for ajax initialize request and end request 
Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(ShowHandler); 
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(HideHandler); 

function ShowHandler(sender, args) { 
    //show div with animation 
    pcProcessing_ClientInstance.Show(); 
} 
function HideHandler(sender, args) { 
    //hide div with animation 
    pcProcessing_ClientInstance.Hide(); 
} 

</script> 
0

Mueva UpdateProgress fuera del UpdatePanel.

Cuestiones relacionadas