有下面的程序,作用是在点击页面上的Button之后,禁用所有的Button,直到服务器端的异步回调之后再启用Button。private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
if(e.CommandName.Equals("bind"))
{
//利用委托去执行你的函数 
AsyncDelegate dlgt = new AsyncDelegate(BeginTest);  //利用委托的BeginInvoke函数,第一个参数是回调函数,有需要的可以自己加,第二个是一个Object对象,好象是回调函数需要的参数什么的东西,这里我没有用到,所以全为null 
IAsyncResult ar = dlgt.BeginInvoke(new AsyncCallback(CallbackMethod), dlgt);  foreach(DataGridItem dgi in DataGrid1.Items)
{
Control c = dgi.FindControl("LinkButton2");
if(c != null)
{
if(c is LinkButton)
{
((LinkButton)c).Enabled = false;
}
}
}
}
}private void BeginTest()
{
Thread.Sleep(3000);
}private void CallbackMethod(IAsyncResult ar)
{
// Retrieve the delegate.
AsyncDelegate dlgt = (AsyncDelegate) ar.AsyncState; // Call EndInvoke to retrieve the results.
dlgt.EndInvoke(ar); //下面要刷新页面
//Server.Transfer("~/WebApplication1/WebForm1.aspx");
}现在的问题是,页面在异步结束之前就已经返回了。我如何能够在异步回调之后通知客户端的页面我把事情做完了,并且将所有的Button置为可用呢?

解决方案 »

  1.   

    只要向客户端发送完</html>就不能再发东西了.解决办法:
    1.不使用导步调用,开发时使用Response.Flush先把数据发向客户端(要包含使控件enable=false的javascript脚本,然后执行完ar方法后再Response.end(比较麻烦)
    2.使用javascript.
      

  2.   

    使用javascript禁用按钮之后,按钮的postback事件就不能触发了。
      

  3.   

    请使用Page的GetPostBackEventReference方法
    this.Button1.Attributes.Add("onclick","this.disabled=true;"+GetPostBackEventReference(this.Button1)+";");题外话:
    异步委托这样很简单阿
    protected delegate void AsyncDelegate();
    private void BeginTest()
    {
    Thread.Sleep(3000);
    }private void Button1_Click(object sender, System.EventArgs e)
    {
    AsyncDelegate dlgt = new AsyncDelegate(BeginTest); 
    IAsyncResult ar = dlgt.BeginInvoke(null,null);
    dlgt.EndInvoke(ar);
    this.Button1.Enabled = true;
    }
      

  4.   

    你是webform不是winform,不能这么做的。
    webform要实现这样的回调,只有用javascript不断刷新页面,你可以搜索一下ajax的例子,和这个差不多。
      

  5.   

    OK,解决了,绕了一圈回到的原点,还是用js+后台代码解决的。
      

  6.   

    代码:
    foreach(DataGridItem dgi in dgFileList.Items)
    {
    Control c = dgi.FindControl("Button1");
    if(c != null)
    {
    if(c is Button)
    {
    string strCommand = "disableOtherSubmit();" + GetPostBackEventReference(c) + ";";
    ((Button)c).Attributes.Add("onclick", strCommand);
    }
    }
    }