Det blev faktisk så sent at eksperten var lukket :o)
Du kan lige får nogle snippets her - det er bare pladderkode, men jeg håber det illustrerer nogle principper du kan gå videre med.
Du kan også godt få events mv. når tiden løber ud.
Der er en timer i auktionsklassen der sådan set sagtens kan undværes, men jeg har lagt den ind for eksemplets skyld, og fordi der sikkert alligevel skal ske et eller andet når en auktion timer ud.
Håber du kan bruge nogle af klodserne til et eller andet.
mvh
// først en side hvor du kan oprette en auktion
// desiden kan siden hente lidt oplysninger fra en handler vha. javascript
<html xmlns="
http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
<script language="javascript" type="text/javascript">
function updateTime()
{
var targetUrl = "Handler.ashx";
var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlHttp.open( "POST", targetUrl, false);
xmlHttp.send();
var res = xmlHttp.responseText;
var times = xmlHttp.responseText.split('|');
for(i=0;i<auctionFields.length;i++)
{
window.status = "[" + auctionFields[i] + "|" + times[i] + "]";
document.getElementById(auctionFields[i]).innerText = times[i];
}
setTimeout("updateTime()", 1000);
}
</script>
</head>
<body id="body" runat="server">
<form id="form1" runat="server">
<div>
<table border="0">
<tr>
<td style="width: 100px">
Navn</td>
<td style="width: 100px">
Afsluttes</td>
<td style="width: 100px">
Opret</td>
</tr>
<tr>
<td style="width: 100px"><asp:TextBox ID="txtAuctionName" runat="server"></asp:TextBox></td>
<td style="width: 100px"><asp:TextBox ID="txtEndtime" runat="server"></asp:TextBox></td>
<td style="width: 100px"><asp:Button ID="btnCreateAuction" runat="server" Text="Opret auktion" OnClick="btnCreateAuction_Click" /></td>
</tr>
</table>
</div>
</form>
</body>
</html>
// her noget kode til siden
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack)
ShowAuctions();
}
protected void btnCreateAuction_Click(object sender, EventArgs e)
{
// bare lige så man slipper for at taste et tidspunkt ind
DateTime endTime = DateTime.Now.AddMinutes(DateTime.Now.Minute);
try
{
endTime = DateTime.Parse(txtEndtime.Text);
}
catch { }
AuctionServer.CreateAuction(txtAuctionName.Text, endTime);
ShowAuctions();
}
private void ShowAuctions()
{
StringBuilder array = new StringBuilder();
Table tbl = new Table();
tbl.GridLines = GridLines.Both;
form1.Controls.Add(tbl);
TableRow tr = null;
TableCell tc = null;
int count = 0;
foreach (Auction auction in AuctionServer.Auctions)
{
tr = new TableRow();
tc = new TableCell();
tc.Text = auction.Name;
tr.Cells.Add(tc);
tbl.Rows.Add(tr);
tc = new TableCell();
tc.ID = "timeLabel_" + count.ToString();
tc.Text = String.Format("{0}:{1}:{2}", auction.TimeLeft.Hours, auction.TimeLeft.Minutes, auction.TimeLeft.Seconds);
tr.Cells.Add(tc);
tbl.Rows.Add(tr);
array.Append("'");
array.Append(tc.ClientID);
array.Append("'");
if (AuctionServer.Auctions.IndexOf(auction) < AuctionServer.Auctions.Count-1)
{
array.Append(",");
}
count++;
}
ClientScript.RegisterArrayDeclaration("auctionFields", array.ToString());
if (AuctionServer.Auctions.Count > 0)
{
body.Attributes.Add("onload", "updateTime();");
}
}
// et par klasser til at simulere auktioner
// auktionsserver
public class AuctionServer
{
private static ArrayList _auctions;
public static ArrayList Auctions
{
get { return AuctionServer._auctions; }
}
static AuctionServer()
{
_auctions = new ArrayList();
}
public static Auction CreateAuction(string name, DateTime endTime)
{
Auction auction = new Auction(name, endTime);
_auctions.Add(auction);
return auction;
}
}
// en auction
public class Auction
{
private string _name;
private bool _hasEnded;
private Timer timer;
private DateTime _startTime;
private DateTime _endTime;
public TimeSpan TimeLeft
{
get { return _endTime - DateTime.Now; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public bool HasEnded
{
get { return _hasEnded; }
}
public DateTime EndTime
{
get { return _endTime; }
set { _endTime = value; }
}
public DateTime StartTime
{
get { return _startTime; }
set { _startTime = value; }
}
public Auction(string name, DateTime endTime)
{
_name = name;
_startTime = DateTime.Now;
_endTime = endTime;
timer = new Timer();
timer.Interval = 1000;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (DateTime.Now >= _endTime)
{
_hasEnded = true;
timer.Stop();
timer.Dispose();
}
}
}
// og til sidste en handler der kan returnere den resterende tid clientside
public class Handler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
StringBuilder response = new StringBuilder();
foreach (Auction auction in AuctionServer.Auctions)
{
response.Append(String.Format("{0}:{1}:{2}:{3}", auction.TimeLeft.Days, auction.TimeLeft.Hours, auction.TimeLeft.Minutes, auction.TimeLeft.Seconds));
if (AuctionServer.Auctions.IndexOf(auction) < AuctionServer.Auctions.Count-1)
{
response.Append("|");
}
}
context.Response.Write(response.ToString());
}
public bool IsReusable
{
get
{
return false;
}
}
}