2011-08-19 104 views
2

我有一個問題,我必須停止一個按鈕單擊加載類。我已經檢查了一些與此相關的論壇。但沒有找到確切的解決方案。如何在點擊按鈕時停止加載功能?

例如:

Public Sub LoadDropDown() 
    Dim it As Integer 
    For it = 0 To 1000000 
     DropDownList1.Items.Add(it) 
    Next 
End Sub 

我要加載的Load按鈕單擊下拉,我必須取消對取消按鈕的點擊。

+0

感謝@Waqas格式化OP的代碼示例 –

+1

@Rajsmethode:我希望你不會認真考慮構建這麼多DropDownList項目?!你知道這也必須發送到客戶端並從瀏覽器呈現嗎? –

+0

是的,我知道,我只是給出了一個例子作爲下拉列表,我有模擬器問題,用戶想取消加載gridview。我用javascript abortPostBack()方法完成了ajax更新面板。但它會停止回發,並且服務器端代碼將繼續工作到事件完成。你能給我任何想法嗎? – Rajsmethode

回答

0

由於填充控件發生在服務器上,我無法想象如何從客戶端中斷您的方法。整個控件正在填充,渲染,然後才發送給客戶端。您可能會使用ajax中斷回調,但是控件根本不會返回。

另一種方法是用ajax加載塊,並將它們附加到客戶端的控件上。

+0

我剛剛舉了一個例子,如果加載一個網格視圖與沉重的數據,那麼用戶如何取消?我嘗試了Ajax更新面板,它的工作良好,它會停止加載,但服務器端功能將在後臺工作,我怎麼能阻止呢? – Rajsmethode

+0

一旦運行,您就不能停止服務器端處理。不幸的是,這是網絡的異步性質。或者至少你必須編寫大量的基礎設施來模擬狀態,以便'取消'請求可以映射到仍在後臺某處運行的特定進程。 –

+0

是的,它是必需的。一些加載函數用戶應該有一個選項來取消,否則他不得不等待完成加載,即使他不想要。這就是我試圖阻止這個過程的任何可能性的原因。感謝您的建議。 – Rajsmethode

0

有沒有正式的方法來做你所要求的,但如果你重構你的代碼,你應該能夠達到相同的結果。如果某些用戶不能加載某些內容,請在代碼中執行該邏輯,然後再呈現給頁面。

0

根據您迴應其他答案...

你可以考慮做多my_ddl.items.add()調用一個計時器。將涉及多個單獨的回發/ ajax調用。例如:

1) add records for 2 seconds (instead of a fixed number of records at a time) 
2) check for session("continue") = "true" 
3) add more records for 2 more seconds 
4) check session("continue") 
... 

在某些時候,用戶單擊cancel,將「false」指定給會話(「continue」)。下一次你的循環檢查會話(「繼續」),它會看到它是錯誤的並退出。

這會給你一個部分加載的數據控件。您可能需要其他代碼來清除部分更新。

+0

但是我怎樣才能改變會話繼續爲假?如果我在取消按鈕事件中寫入編碼,它應該在完成加載按鈕之後才被觸發,因爲我可以執行該編程。我如何從客戶端更改會話價值? – Rajsmethode

+0

嗯,我認爲可以通過腳本管理器和web方法,但不必使用會話 - 可以是任何在頁面上保存值的任何內容。例如,你可以使用JavaScript取消按鈕,使它在你的DOM中設置一個值(如隱藏字段的文本值等) – Chains

+0

我試過你的方法它的工作,但仍然有問題,如果我使用存儲過程或sql查詢,我認爲我們不能像這樣停下來,在那種情況下我能做什麼?請指教我 – Rajsmethode

0

我想你可以用會話變量來完成這個任務。原諒我,但我將不得不在C#中提供示例,但我相信你可以得到這個概念。

private bool CancelRequested 
     { 
      get 
      { 
       if (Session["CancelRequested"] == null) 
        return false; 
       else 
        return (bool)Session["CancelRequested"]; 
      } 
      set 
      { 
       Session["CancelRequested"] = value; 
      } 
     } 

     public void LoadDropDown() 
     { 
      for (int it = 0; it <= 1000000; it++) 
      { 
       if (CancelRequested) 
       { 
        CancelRequested = false; 
        break; 
       }      
       //Your logic here 
      } 
     } 

     protected void btnCancelRequest_Click(object sender, EventArgs e) 
     { 
      CancelRequested = true; 
     } 

這裏的想法是,inital循環檢查一個Session變量,看它是否應該繼續或跳出循環。如果頁面上有一個按鈕允許用戶將此Session變量設置爲「true」,則它們可以與初始請求進行基本通信並使其跳出循環。我不確定這是否能夠完全實現您期望實現的目標,但希望它有所幫助。