undskyld ventetiden - her et lille eksempel.... Det er ikke ligefrem produktionskode ;o)
(men ... det kan være at du lige kan få en idé af det)
først en form:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="
http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script language="javascript" type="text/javascript">
function GetProgress()
{
message='';
<%= CallBackReference %>
}
function ShowProgress(message)
{
document.getElementById('<%= txtStatus.ClientID %>').value += message;
if(message != 'DONE')
{
window.setTimeout('GetProgress()', 500);
}
}
</script>
</head>
<body id="body" runat="server">
<form id="form1" runat="server">
<div>
<asp:Button ID="btnStart" runat="server" Text="Start" OnClick="btnStart_Click" />
<asp:Button ID="btnCheckStatus" runat="server" Text="Check" /><br />
<asp:TextBox ID="txtStatus" runat="server" TextMode="MultiLine" Height="300px" Width="400px"></asp:TextBox>
</div>
</form>
</body>
</html>
// og så så en codebehind
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using System.Threading;
public partial class _Default : System.Web.UI.Page, ICallbackEventHandler
{
protected WorkerClass Worker
{
get { return Session["Worker"] as WorkerClass; }
set { Session["Worker"] = value; }
}
protected string CallBackReference
{
get { return ClientScript.GetCallbackEventReference(this, "message", "ShowProgress", null); }
}
protected void Page_Load(object sender, EventArgs e)
{
body.Attributes["onload"] = null;
}
protected void btnStart_Click(object sender, EventArgs e)
{
Worker = new WorkerClass();
Worker.DoTheWork();
body.Attributes.Add("onload", "GetProgress();");
}
#region ICallbackEventHandler Members
public string GetCallbackResult()
{
if (Worker.WorkDone == 10)
{
body.Attributes["onload"] = null;
Worker = null;
return "DONE";
}
else
{
return Worker.WorkDone.ToString() + Environment.NewLine;
}
}
public void RaiseCallbackEvent(string eventArgument)
{
}
#endregion
}
public class WorkerClass
{
private int _workDone;
public int WorkDone
{
get { return _workDone; }
}
public void DoTheWork()
{
Thread thread = new Thread(new ThreadStart(this.DoTheWorkInternal));
thread.Start();
}
private void DoTheWorkInternal()
{
for (int i = 1; i <= 10; i++)
{
Thread.Sleep(500);
_workDone = i;
}
}
}
det er bare fis og ballade - men du kan da lige prøve det af.
mvh