Использование задач UpdateProgress

У меня есть кнопка на моей странице 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();
        }
7
задан Hari Menon 23 July 2010 в 13:45
поделиться

5 ответов

Согласно проблеме (1), скорее всего, это тайм-аут ajax. Тайм-аут по умолчанию составляет 90 секунд. Чтобы увеличить это, используйте свойство AsyncPostBackTimeout в ScriptManager:

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

Если время ожидания вызова ajax истекает, элементы управления на странице могут работать некорректно, поэтому увеличение времени ожидания также может решить проблему (2).

15
ответ дан 6 December 2019 в 09:57
поделиться

Возможно, вам нужно это: http://www.codeproject.com/kb/Ajax/ModalUpdateProgress.aspx

alt text

У меня работает хорошо, даже при длительных операциях.

2
ответ дан 6 December 2019 в 09:57
поделиться

У меня были такие же проблемы с 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>
2
ответ дан 6 December 2019 в 09:57
поделиться

Переместите UpdateProgress за пределы UpdatePanel.

0
ответ дан 6 December 2019 в 09:57
поделиться

Похоже, что ваша сетка находится вне панели обновления, если вы используете панель обновления и ваша кнопка находится внутри панели обновления, а сетка вне панели обновления, в этом случае все будет происходить на стороне сервера, но вы не найдете никаких изменений в пользовательском интерфейсе.

Попробуйте разместить грид внутри панели обновления.

0
ответ дан 6 December 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: