Проблемы с использованием UpdateProgress - PullRequest
7 голосов
/ 23 июля 2010

У меня есть кнопка на моей странице ASP.NET, которая выбирает некоторые данные из моей базы данных и отображает их в виде таблицы.

Этот процесс занимает некоторое время, поэтому я подумал, что добавлю элемент управления AJAX updateprogress.Теперь, когда я нажимаю кнопку, появляется изображение updateprogress, и данные успешно извлекаются из моей базы данных (я проверил это по некоторым журналам, которые есть в моей БД).Но есть 2 проблемы:

(1) Изображение updateprogress отображается только в течение примерно 2 минут.Но мое событие нажатия кнопки занимает около 5 минут.По сути, процесс обновления перестает отображаться даже до того, как моя задача завершена, что противоречит ее цели.

(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>

Часть файла кода:

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();
        }

Ответы [ 5 ]

15 голосов
/ 29 июля 2010

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

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

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

2 голосов
/ 23 июля 2010

Может быть, вы хотите это: http://www.codeproject.com/kb/Ajax/ModalUpdateProgress.aspx

alt text

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

2 голосов
/ 23 июля 2010

У меня были такие же проблемы с 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>
0 голосов
/ 23 июля 2010

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

0 голосов
/ 23 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...