質問者さんの回答のコメント欄の 2020/03/20 17:02 の私のコメントに、
UpdatePanel を使うなら、処理中の表示には UpdateProgress を使うとか、ScriptManager が提供するクライアント側でのイベントを使うとかいう手段があります。後で、ご参考までに、例を紹介しておきます。
と書きましたが、それを以下に書きます。
UpdatePanel に表示する処理が進行中であるのを表示するために UpdateProgress が用意されています。
加えて、ScriptManager が提供するクライアント側でのイベントも利用できます。イベントは initializeRequest ⇒ beginRequest ⇒ pageLoading ⇒ pageLoaded ⇒ endRequest の順で発生するので、その適当なイベントに JavaScript のリスナをアタッチして処理中であることを表示することもできます。
そのサンプルコードを以下にアップしておきます。
.aspx.cs
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication1
{
public partial class WebForm3 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(5000);
Label1.Text = "処理完了";
}
}
}
.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication1.WebForm3" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script type="text/javascript">
//<![CDATA[
var manager;
function pageLoad(sender, args) {
if (args.get_isPartialLoad() === false) {
manager = Sys.WebForms.PageRequestManager.getInstance();
manager.add_beginRequest(OnBeginRequest);
manager.add_endRequest(OnEndRequest);
}
}
// 非同期要求の送信時に、アニメーションの表示などの
// スクリプトを起動する場合はここに設定。
function OnBeginRequest(sender, args) {
var elem = document.getElementById("progress");
elem.setAttribute("style","display:block");
}
// 完了時にスクリプトを起動する場合はここに設定。
function OnEndRequest(sender, args) {
var elem = document.getElementById("progress");
elem.setAttribute("style","display:none");
}
// 実行中の非同期ポストバックを停止するスクリプト。
// UpdateProgress に配置したボタンの onclick に設定。
// サーバー側の処理まで停止されるわけではないので注意
function AbortPostBack() {
if (manager.get_isInAsyncPostBack()) {
manager.abortPostBack();
}
}
window.onload = function loadingShow() {
document.getElementById("Button1").click()
};
//]]>
</script>
</head>
<body>
<form id="form1" runat="server" >
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<h3>UpdatePanel と UpdatePgrogress</h3>
<div id="progress" style="display:none">
<img src="/Images/grid-loading.gif" alt="" />
スクリプトで表示・・・.
<input type="button" onclick="AbortPostBack()" value="Cancel" />
</div>
<asp:UpdateProgress ID="UpdateProgress1" runat="server"
AssociatedUpdatePanelID="UpdatePanel1">
<ProgressTemplate>
<asp:Image ID="Image1" runat="server"
ImageUrl="~/Images/grid-loading.gif" />
UpdateProgress で表示・・・
<input type="button" onclick="AbortPostBack()" value="Cancel" />
<br /><br />
</ProgressTemplate>
</asp:UpdateProgress>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="Label1" runat="server"></asp:Label>
<asp:Button ID="Button1" runat="server" Text="Button"
style="display:none" OnClick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
実行すると、質問者さんがやったように window.onload で自動的にボタンクリックされ、その際クライアントスクリプトで以下の画像のようプログレスが表示され、その後ポストバックされてサーバー側で Button1_Click に制御が飛んで、 Thread.Sleep(5000) で 5 秒待ってから UpdatePanel 内の Label1 に "処理完了" と表示されます。
だたし、前にも書きましたが、処理が 2 秒程度で済むなら、Loading と表示してからポストバックを行うというのは、無駄なラウンドトリップに余計に時間がかり、サーバー側の負担を大きくするので意味はない、と言うより本末転倒だと思いますが・・・