У меня есть кнопка на моей странице ASP.NET, которая выбирает некоторые данные из моей базы данных и отображает ее на gridview.
Этот процесс требует времени, таким образом, я думал, что добавлю updateprogress управление Ajax. Теперь, когда я нажимаю кнопку, изображение updateprogress обнаруживается, и данные выбираются от моей базы данных успешно (я проверил это от некоторых журналов, которые я имею в своем DB). Но существует 2 проблемы:
(1) Изображение updateprogress показывает только в течение приблизительно 2 минут. Но мое buttonclick событие занимает приблизительно 5 минут для завершения. В основном updateprogress заделывает показ даже, прежде чем моя задача будет завершена, который побеждает ее цель.
(2) GridView не обнаруживается. Это обнаруживается правильно, если я не использую scriptmanager/AJAX.
Какие-либо идеи?
Некоторые отрывки соответствующих норм:
<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:
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();
}
Согласно проблеме (1), скорее всего, это тайм-аут ajax. Тайм-аут по умолчанию составляет 90 секунд. Чтобы увеличить это, используйте свойство AsyncPostBackTimeout в ScriptManager:
<asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="400">
</asp:ScriptManager>
Если время ожидания вызова ajax истекает, элементы управления на странице могут работать некорректно, поэтому увеличение времени ожидания также может решить проблему (2).
Возможно, вам нужно это: http://www.codeproject.com/kb/Ajax/ModalUpdateProgress.aspx
У меня работает хорошо, даже при длительных операциях.
У меня были такие же проблемы с ASP.NET UpdateProgress. Я исправил это, обработав события диспетчера сценариев напрямую:
<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>
Похоже, что ваша сетка находится вне панели обновления, если вы используете панель обновления и ваша кнопка находится внутри панели обновления, а сетка вне панели обновления, в этом случае все будет происходить на стороне сервера, но вы не найдете никаких изменений в пользовательском интерфейсе.
Попробуйте разместить грид внутри панели обновления.