webForumDet fria alternativet

repeater i en repeater

.NET

9 svar · 231 visningar · startad av henrikjohansson

Medlem sedan maj 2000360 inlägg
Frågan#1

Går det att göra så att man lägger en repeater i en annan repeater?

För jag har en repeater som listar ut lite grejer ur en databas, bland annat ett ID nummer. Sedan vill jag att för varje item i den fösta repeatern så skall den även lista ut lite grejer med ID nummret som vilkor i SQLen..

altså.. så här vill jag att varje item skall se ut skall se ut

Titel 1
ID = 1
här skall det ligga en ny lista där proID = 1
Titel 2
ID = 2
här skall det ligga en ny lista där proID = 2
osv..

Hoppas ni förstår :D

Medlem sedan juni 20011 732 inlägg
#2

Javisst, det är inga problem, du kan ha kontroller i kontroller i kontroller.

Det går att lösa på många olika sätt, börja med att skapa två repeaters där den andra repeatern ligger i den första repeaterns itemtemplate. Sedan kan du exempelvis skapa en funktion med den första repeaterns id som inparameter som sedan returnerar den datakälla som ska fylla repeater nummer två.

Nåt sånt här kanske (fritt skrivet):

<asp:repeater id="R1" runat="server">
  <itemtemplate>
    
    <asp:repeater id="R2" DataSource="<%# myFunction(DataBinder.Eval(Container.DataItem, "ID")) %>" runat="server">
      <itemtemplate>
      </itemtemplate>
    </asp:repeater>

  </itemtemplate>
</asp:repeater>

//och i koden:
protected string myFunction(object ID) {
//kod här där du använder ID för att hämta data som du sedan returnerar
  return myData;
}
Medlem sedan juni 20011 732 inlägg
#3

Här finns en liknande diskussion!

http://www.webforum.nu/showthread.php?s=&threadid=58638

Medlem sedan maj 2000360 inlägg
#4

Jag har nu fått det att fungera.. nästan.. :D

Saken är den att jag kan bara skriva
DataSource="<%#GetUnderrubriker(4)%>"
och inte
DataSource="<%#GetUnderrubriker(Container.dataitem("ID"))%>"
eller
DataSource="<%#GetUnderrubriker(DataBinder.Eval(Container.DataItem, "ID"))%>"
den klagar bara på att container inte är deklarerad. skumt..
Jag testade även med
<%dim Id as integer
id = Container.dataitem("ID)"
%> för att sedan använda variablen ID i funktionsanropet.. även där klagar den på Container..

Det är säkert ett riktigt enkelt fel men jag hittar det iallafall inte :D

Medlem sedan juni 20011 732 inlägg
#5

Detta var ju alltså under förutsättning att du har ett ID i den datakälla du använder för att fylla din repeater med. Du måste alltså fylla din första repeater med det id du använder för att plocka ut datakällan i din andra repeater!

Medlem sedan maj 2000360 inlägg
#6

Jag har ID i den databasen som jag kopplar mot den första repeatern..
skriver jag <%#Container.dataitem("ID")%> så skrivs det ut.. men jag kan inte använda det värdet i funktionen för då klagar den

Medlem sedan juni 20011 732 inlägg
#7

Hur tar du emot ditt id då!? Du måste ta emot det som ett object eftersom det är den datatypen du skickar in i funktionen:

protected string myFunction(object ID) {

Medlem sedan juni 20011 732 inlägg
#8

aha, nu ser jag... du ska ha enkelfnuttar runt:

Datasource='<%#GetUnderrubriker(DataBinder.Eval(Container.DataItem, "ID"))%>'
Medlem sedan maj 2000360 inlägg
#9

ok tack.., nu funkar det.

En fråga bara.. vad gör databinder.eval?

Medlem sedan juni 20011 732 inlägg
#10

Från quickstart:

The ASP.NET framework supplies a static method that evaluates late-bound data binding expressions and optionally formats the result as a string. DataBinder.Eval is convenient in that it eliminates much of the explicit casting the developer must do to coerce values to the desired data type. It is particularly useful when data binding controls within a templated list, because often both the data row and the data field must be cast.

DataBinder.Eval is simply a method with three arguments: the naming container for the data item, the data field name, and a format string. In a templated list like DataList, DataGrid, or Repeater, the naming container is always Container.DataItem. Page is another naming container that can be used with DataBinder.Eval. The format string argument is optional. If it is omitted, DataBinder.Eval returns a value of type object, as shown in the following example.

It is important to note that DataBinder.Eval can carry a noticeable performance penalty over the standard data binding syntax because it uses late-bound reflection. Use DataBinder.Eval judiciously, especially when string formatting is not required.

274 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
140 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
135 ms — ändringar (db)