我有一個web應用程序(不是窗體),用戶從列表框(選擇框)中選擇項目,然後按下「提交」按鈕。提交後,應用程序將形成SQL查詢並連接到數據庫fillup Datatable - 轉換爲html代碼並在頁面上打印表格。我想要做的就是當他們按下提交按鈕時,當表格準備好顯示在頁面上時,顯示一個圖像(用戶在後臺進行查詢和建立表格等等的指示符),隱藏圖像。到目前爲止,這就是我所做的。現在Backgroundworker和圖像
BackgroundWorker bw = new BackgroundWorker();
protected void Page_Load(object sender, EventArgs e)
{
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
public void SQL_Query() {...database connection and fill up data table }
protected void Submit_Button(object sender, EventArgs e)
{
//LoadingImage.Visible = true; //this does not work
if (bw.IsBusy != true)
{
bw.RunWorkerAsync();
}
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
SQL_Query();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
this.tbProgress.Text = "Canceled!";
}
else if (!(e.Error == null))
{
this.tbProgress.Text = ("Error: " + e.Error.Message);
}
else
{
//when the query is completed, customize the data and print it on page as label
LoadingImage.Visible = false;
if (SQLQuery_Table.Rows.Count >= 1)
{
CustomizedTable(SQLQuery_Table);
}
string str = Display_Table();
label.Text = str
}
}
,隨着代碼的問題是,LoadingImage.Visible = true;
不會使按下按鈕時的圖像顯示。據我讀到的關於backgroundworker的其他類似帖子,它說UI不能在同一個線程中工作。我不想做任何進度條,因此對Reportprogress沒有興趣。簡單地,使圖像出現在提交按鈕上並在bw_RunWorkerCompleted
中消失。如何在用戶按下提交按鈕時顯示圖像?我想保持簡單,所以如果我可以避免爲Image創建另一個背景工作,那將會很棒。謝謝!
其實,LoadingImage.Visible = false在bw_RunWorkerCompleted中工作,因爲我相信異步操作已完成。所以爲什麼不能在執行bw.RunWorkerAsync()之前進行LoadingImage.Visible = true。爲什麼它不起作用? – user2848183
@ user2848183當異步操作完成時,更改響應爲時已晚。它已經發送。這裏沒有建立任何雙向溝通。客戶端發出請求,服務器發送響應。這不像沒有客戶端/服務器關係的桌面應用程序,您的代碼可能因任何原因隨時影響UI。 – Servy
現在確定它是有道理的。我如何解決這個問題?我需要做2個後臺工作(一個用於圖像,另一個用於sql查詢)並同步它們?如果您有任何示例,我將不勝感激! – user2848183