webForumDet fria alternativet

Jämföra datum

.NET

9 svar · 594 visningar · startad av Rossifumi

Medlem sedan okt. 20001 558 inlägg
Frågan#1

Jag har ett datum i en databas som jag vill jämföra med dagens datum. Har hittat den här sidan där dom går igenom lite hur man kan göra.

Men nu till min fråga. Hur kommer jag i min repeater åt datumet ur databasen?
När jag bara vill skriva ut det så skriver jag ju <%# DataBinder.Eval(Container.DataItem, "threadDateTime") %>, försöker jag skriva t.ex System.DateTime date2 = DataBinder.Eval(Container.DataItem, "threadDateTime"); så knasar det ut rejält.

Hjälp :l

Medlem sedan okt. 20005 273 inlägg
#2

OT: fan va kul att se dig här igen Rossi :D

Nu till frågan. Visa lite av din reapeter-kod:

Mv icaaq

Medlem sedan dec. 20003 563 inlägg
#3

Du kan skapa en funktion och anropa den med datumet som argument, och då göra vad du vill med den.

<%# functionToEvalDate(container.dataitem("threadDateTime"))%>
Medlem sedan okt. 20001 558 inlägg
#4

Kul att vara här igen ;)
Vill du ha koden ur code-behind eller ur dokumentet?

Medlem sedan okt. 20005 273 inlägg
#5

Antingen gör du som cyprys visar. men jag brukar kör en onitemdatabound på repetern för att i cb-filen sköta alla bindningar.

vill du se hur jag brukar göra kan du posta båda koderna.

mv icaaq

Medlem sedan okt. 20001 558 inlägg
#6

cyprys skrev:

Du kan skapa en funktion och anropa den med datumet som argument, och då göra vad du vill med den.

<%# functionToEvalDate(container.dataitem("threadDateTime"))%>

Skriver:

<%
System.DateTime date1 = System.DateTime.Now;
[b]System.DateTime date2 = functionToEvalDate(Container.DataItem("threadDateTime"));[/b]
%>

Får då följande felmeddelande på den feta raden:

Compiler Error Message: CS0246: The type or namespace name 'Container' could not be found (are you missing a using directive or an assembly reference?)
Medlem sedan okt. 20001 558 inlägg
#7

icaaq skrev:

Antingen gör du som cyprys visar. men jag brukar kör en onitemdatabound på repetern för att i cb-filen sköta alla bindningar.

vill du se hur jag brukar göra kan du posta båda koderna.

mv icaaq

Snodde kod rätt av ifrån en annan tråd :OO

private void Page_Load(object sender, System.EventArgs e)
		{
			if(!IsPostBack)
			{
				BindData();
			}

		}

		public void BindData()
		{
			myRep.DataSource = GetData();
			myRep.DataBind();
		}

		public DataTable GetData() 
		{
			DataSet ds = new DataSet();
			string connS = "Provider=Microsoft.Jet.OleDB.4.0;" + "Data Source = " + Server.MapPath("/data/db/forum.mdb");
			string mySQL = "SELECT users.userName, users.userSig,users.userID, threads.threadID, threads.threadDateTime, threads.threadName, threads.threadText FROM threads INNER JOIN users ON threads.threadAuthor = users.userID ORDER BY threads.threadDateTime";
			OleDbConnection conn = new OleDbConnection(connS);
			OleDbDataAdapter adapter = new OleDbDataAdapter();
			adapter.SelectCommand = new OleDbCommand(mySQL, conn);
			adapter.Fill(ds);
			return ds.Tables[0];
		}
Medlem sedan juni 20011 732 inlägg
#8

DataBinder.Eval(Container.DataItem, "threadDateTime") är ett "object" och kan inte jämfölras med ett datum om du inte först typkonverterar det till ett datum annars går det att göra jämförelsen på det sättet (poseudokod):

<%# (DateTime.Now.ToShortDateString() == ([b](DateTime)[/b]DataBinder.Eval(Container.DataItem, "threadDateTime")).ToShortDateString()) %>

//Exempel på användning:
<asp:label visible="<%# (a==b) %>" runat="server">

Men det är bättre att göra detta från koden, exempelvis lägg en label i din repeater och gör nåt sånt här (sen får du naturligtvis modifiera koden och använda rätt kontroll beroende på vad du ska använda jämförelsen till):

private void R_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e) {
  if(e.Item.ItemType == ListItemType.Item)
    ((Label)e.Item.FindControl("myL")).Text = (DateTime.Now == value);
}
Medlem sedan okt. 20005 273 inlägg
#9

i .aspx

[red]
<asp:repeater runat='server' id='myRep' onitemdatabound='dateRep_Bound'>
											<itemtemplate>
												<asp:label runat='server' id='lblDate'/>
											</itemtemplate>
										</asp:repeater>
[/red]

i .cs

[red]
		public void dateRep_Bound(object sender, RepeaterItemEventArgs e)
		{
			switch(e.Item.ItemType)
			{
				case ListItemType.Item:
				case ListItemType.AlternatingItem:

					//Hitta controllen för lbldate
					Control _ctrlDate = e.Item.FindControl("lblDate");
					if(_ctrlDate != null)
					{
						Label _date = (Label)_ctrlDate;
						_date.Text = e.Item.DataItem("threadDateTime");						
					}
				
					break;
			}
		}
[/red]

Kanske det skulle kunna se ut?

mv icaaq

Medlem sedan okt. 20001 558 inlägg
#10

Tackar för alla svar... Skall klura lite nu och återkommer när jag testat.

270 ms totalt · 4 externa anrop · v20260731065814-full.868a69e5
136 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)