2011-08-19 107 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”,则它们可以与初始请求进行基本通信并使其跳出循环。我不确定这是否能够完全实现您期望实现的目标,但希望它有所帮助。