/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
[.Net] Databinding (mix af data og html)
Fra : Jesper Stocholm


Dato : 24-05-02 13:21

Jeg har trukket noget data ud fra en database, og nu skal jeg have
det puttet ind i en tabel.

Hvis det var i ASP, ville det ønskede se således ud:

<table>
<% do while not rs.EOf %>
   <tr>
   <td><a class="default" href="getCourse.aspx?id=<% = rs("id") %>"><% = rs("id") %></a></td>
   <td><% = rs("Name") %></td>
   <td><img src="images/<% = rs("countryCode")%>.gif title="<% = rs("Language")%>"/></td>
   </tr>
<% rs.MoveNext
loop
%>
</table>

Jeg vil altså gerne mixe data og html imens jeg løber igennem data.

Nu ser det jo lidt anderledes ud i .Net :) Jeg har hentet mine data ud i
en datareader og har forsøgt at binde data til et datagrid. Mit problem er,
at det ikke helt virker som jeg gerne vil have det.

Min kode er :

   <asp:DataGrid ID="courseGrid" Runat="server" Width="100%"
       AutoGenerateColumns="False"
      HeaderStyle-Font-Bold="True"
       GridLines="None"
   >
       <Columns>
           <asp:HyperLinkColumn
               DataTextField="intNbr"
               DataNavigateUrlField="intNbr"
               DataNavigateUrlFormatString="getCourse.aspx?id={0}"
               ItemStyle-CssClass="default"
               HeaderText="Number"
           />
           <asp:BoundColumn HeaderText="Course Name" DataField="strName"/>
           <asp:BoundColumn HeaderText="Language" DataField="LanguageFlag"/>
       </Columns>
   </asp:DataGrid>

Jeg har to problemer:

1.
I min link-kolonne vil jeg gerne i mit anchor-tag kunn indsætte en
css-klassereference ... men jeg kan kun få den til at sidde i det
yderste <td>-tag. Hvordan "putter" jeg den et niveau ind ?

2.
I den sidste kolonne vil jeg gerne vise nogle billeder - alt efter data i
den enkelte række ... men hvordan gør jeg det ? Jeg kan ikke indsætte et
<img>-element i mit datagrid, da img-elementet ikke nedarves fra Datagrid,
så jeg er lidt tabt mht hvordan jeg skal komme videre.

Altså: hvordan laver jeg denne i en kolonne i et datagrid :
<td><img src="images/<% = rs("countryCode")%>.gif title="<% = rs("Language")%>"/></td>
?

pft,

:)

--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

 
 
Jesper Stocholm (24-05-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 24-05-02 13:29

Jesper Stocholm wrote in
news:Xns921891F18C479spamstocholmdk@130.226.1.34:

jeg glemte dette:

Hvis man vil se problemet LIVE, så ligger det på
http://stocholm.dk/dtu/courses.aspx



--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Jakob Andersen (24-05-2002)
Kommentar
Fra : Jakob Andersen


Dato : 24-05-02 15:04

"Jesper Stocholm" <spam200205@stocholm.dk> skrev i en meddelelse
news:Xns921891F18C479spamstocholmdk@130.226.1.34...
> <% do while not rs.EOf %>

Hvis du ønsker at bruge en løkke til at løbe igennem dine data skal det
gøres ved at bruge en datareader som dette her(Med Data.Sql namespacet):

System.Text.StringBuilder sb = new System.Text.StringBuilder();
SqlDataReader objDataReader = objComm.ExecuteReader(
CommandBehavior.CloseConnection );
sb.Append("<table>");
while( objDataReader.Read()){
sb.Append("<tr>");
sb.Append("<td>" + objDataReader.getString(0) + "</td>");
....
}
Response.Write( sb.ToString() );

Jeg har i ovenstående valgt at bruge en Stringbuilder da man oftest vil
outputte sådan data til en contol af en slags.


> Jeg vil altså gerne mixe data og html imens jeg løber igennem data.

Til dette kan du bruge en repeater til at vise dine data, Det kunne f.eks.
se sådan her ud:



<script language="c#" runat="server">
void Page_Load(){
SqlConnection objConn = new SqlConnection(
"server=xxxx;database=yyy;UID=z;PWD=....." );
SqlCommand objComm = new SqlCommand();
objConn.Open();
objComm.Connection = objConn;
objComm.CommandText = "SELECT Fornavn, Efternavn, Firma FROM tblPersoner";
SqlDataReader objDataReader =
objComm.ExecuteReader(CommandBehavior.CloseConnection);
Repeater.DataSource = objDataReader;
Repeater.DataBind();
}
</script>
<ASP:Repeater id="Repeater" runat="server">
<HeaderTemplate>
<table width="100%" style="background-color:green;">
<tr>
<th>
Fornavn
</th>
<th>
Efternavn
</th>
<th>
Firma
</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td style="background-color:red;">
<%# DataBinder.Eval(Container.DataItem, "Fornavn") %>
</td>
<td style="background-color:yellow;">
<%# DataBinder.Eval(Container.DataItem, "Efternavn") %>
</td>
<td style="background-color:blue;">
<%# DataBinder.Eval(Container.DataItem, "FirmaID") %>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</ASP:Repeater>

> Nu ser det jo lidt anderledes ud i .Net :) Jeg har hentet mine data ud i
> en datareader og har forsøgt at binde data til et datagrid. Mit problem
er,
> at det ikke helt virker som jeg gerne vil have det.

Du kan i ovenstående se hvordan man kan binde data til en repeater helt som
til et datagrid.

> Altså: hvordan laver jeg denne i en kolonne i et datagrid :
> <td><img src="images/<% = rs("countryCode")%>.gif title="<% =
rs("Language")%>"/></td>

Du printer blot din sti eller hvad du nu har gemt i databasen inde i img
tagget.

Du kan også sagtens bruge kontoller inde i dine templates så hvis dine
billeder skal "gøre noget" kan du lave dem til imagebuttons og sætte
serverside eventhandlers på

--
Jakob Andersen



Jesper Stocholm (26-05-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 26-05-02 15:22

Jakob Andersen wrote in news:aclh8q$6cc$1@sunsite.dk:

> "Jesper Stocholm" <spam200205@stocholm.dk> skrev i en meddelelse
> news:Xns921891F18C479spamstocholmdk@130.226.1.34...
>> Jeg vil altså gerne mixe data og html imens jeg løber igennem data.
>
> Til dette kan du bruge en repeater til at vise dine data,

det var denne metode jeg endte med at vælge ... den er så tilpas XSL-nær,
at den er behagelig at arbejde med ... :)

Jeg har dog et problem med udskriften af mine data. De kommer fra en
mySQL-db, hvor fx [Language]-feltet er defineret som varchar(3). Men
da fx Danmark og England er hhv dk og uk, så er der jo en karakter
"tilovers". Det giver et problem, da den så ikke kan finde det billede
der skal hentes.

Koden ser således ud:

<script language="c#" runat="server">
   void Page_Load(Object sender,EventArgs e) {
       ...
      Repeater.DataSource = oDataReader;
       Repeater.DataBind();
       ...
   }
</script>
   <ASP:Repeater id="Repeater" runat="server">
       <HeaderTemplate>
           <table width="100%" >
               <tr><th>Language</th></tr>
       </HeaderTemplate>
       <ItemTemplate>
           <tr><td >
                   <img src="/images/<%#DataBinder.Eval(Container.DataItem, "LanguageFlag") %>.gif" alt="<%# DataBinder.Eval(Container.DataItem, "Language") %>"/>
               </td></tr>
       </ItemTemplate>
       <FooterTemplate>
           </table>
       </FooterTemplate>
   </ASP:Repeater>

Men det giver mig en img-kode som

<table width="100%">
   <tr><td>Language</th></tr>
   <tr><td><img src="/images/uk .gif"/>Danish</td></tr>
</table>

Hvordan trimmer jeg felter for leading og trailing blanks ? Jeg har
forgæves forsøgt med

<%#DataBinder.Eval(Container.DataItem.Trim(), "LanguageFlag") %>
<%#DataBinder.Eval(Container.DataItem, "LanguageFlag").Trim() %>
<%#DataBinder.Eval(Trim(Container.DataItem), "LanguageFlag") %>

.... men intet af det virker.

Problemet kan ses live på http://stocholm.dk/dtu/courses.aspx

:)

--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Jakob Andersen (26-05-2002)
Kommentar
Fra : Jakob Andersen


Dato : 26-05-02 15:36

"Jesper Stocholm" <spam200205@stocholm.dk> skrev i en meddelelse
news:Xns921AA686CA3F3spamstocholmdk@130.226.1.34...
> det var denne metode jeg endte med at vælge ... den er så tilpas XSL-nær,
> at den er behagelig at arbejde med ... :)

Det kan så diskuteres om XSL er behagelig at arbejde med, personlig har jeg
en lidt underlig fornemmelse når man klemmer programmering/scripting ned i
noget der minder om markup

> Jeg har dog et problem med udskriften af mine data. De kommer fra en
> mySQL-db, hvor fx [Language]-feltet er defineret som varchar(3). Men
> da fx Danmark og England er hhv dk og uk, så er der jo en karakter
> "tilovers".

Har du selv sat den blanke karakter ind, eller er det databasen/odbc
driveren der hiver whitespaces ud da feltet ikke er fyldt ud?

> Hvordan trimmer jeg felter for leading og trailing blanks ? Jeg har
> forgæves forsøgt med
> <%#DataBinder.Eval(Container.DataItem.Trim(), "LanguageFlag") %>
> <%#DataBinder.Eval(Container.DataItem, "LanguageFlag").Trim() %>
> <%#DataBinder.Eval(Trim(Container.DataItem), "LanguageFlag") %>
> ... men intet af det virker.

<%# DataBinder.Eval( Container.DataItem, "LanguageFlag").ToString().Trim()
%>

Virker det ikke?

--
Jakob Andersen



Jesper Stocholm (26-05-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 26-05-02 15:45

Jakob Andersen wrote in news:acqrtl$711$1@sunsite.dk:

> "Jesper Stocholm" <spam200205@stocholm.dk> skrev i en meddelelse
> news:Xns921AA686CA3F3spamstocholmdk@130.226.1.34...
>> det var denne metode jeg endte med at vælge ... den er så tilpas
>> XSL-nær, at den er behagelig at arbejde med ... :)
>
> Det kan så diskuteres om XSL er behagelig at arbejde med, personlig
> har jeg en lidt underlig fornemmelse når man klemmer
> programmering/scripting ned i noget der minder om markup

det kan du jo self. sige ... det var nu også mere strukturen i
XML-"markup"et jeg godt kan lide. Den anden metode med string-
concatenation er meget muligt mere optimal, men imo giver den utrolig
ulæselig kode ... :)

>> Jeg har dog et problem med udskriften af mine data. De kommer fra en
>> mySQL-db, hvor fx [Language]-feltet er defineret som varchar(3). Men
>> da fx Danmark og England er hhv dk og uk, så er der jo en karakter
>> "tilovers".
>
> Har du selv sat den blanke karakter ind, eller er det databasen/odbc
> driveren der hiver whitespaces ud da feltet ikke er fyldt ud?
>

jeg har ikke selv sat den blanke karakter ind ... den hiver selv den
blanke karakter med ud i SQL-kaldet. Det gør MSSQL jo da vist også ...

> <%# DataBinder.Eval( Container.DataItem,
> "LanguageFlag").ToString().Trim() %>
>

jo ... det gør det faktisk. Jeg skal lige vænne mig til at mange ting
skal converteres til strenge før de kan bruges i fx Labels etc ... det er
man jo ikke ligefrem vant til i ASP :)

Fx driller det mig stadig, at man ikke umiddelbart kan lave følgende

void AssignValue() {
   int i = 42;
   someLabel.Text = i;
}

.... men skal gøre dette i stedet:

void AssignValue() {
   int i = 42;
   someLabel.Text = i.ToString();
}


tak for hjælpen :)

--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Jakob Andersen (26-05-2002)
Kommentar
Fra : Jakob Andersen


Dato : 26-05-02 16:01

"Jesper Stocholm" <spam200205@stocholm.dk> skrev i en meddelelse
news:Xns921AAA7767543spamstocholmdk@130.226.1.34...
> det kan du jo self. sige ... det var nu også mere strukturen i
> XML-"markup"et jeg godt kan lide. Den anden metode med string-
> concatenation er meget muligt mere optimal, men imo giver den utrolig
> ulæselig kode ... :)

Det var nu ikke ment som en tale for ikke at bruge repeateren, den er
sikkert optimeret så meget at den er omtrent ligeså hurtig som at bruge en
stringbuilder. Mit opstød kom mest af at XSLT hænger mig langt ud af halsen
for tiden, de mest basale ting skal man oftest til at skrive sine egne
funktioner(templates) til, og ofte ender man ud i nogle løsninger med at
bruge "hacks" af en slags for at få XSLT til at makke ret.

> jeg har ikke selv sat den blanke karakter ind ... den hiver selv den
> blanke karakter med ud i SQL-kaldet. Det gør MSSQL jo da vist også ...

Det mener jeg nu ikke, men det skal jeg nok ikke gøre mig klog på.

> jo ... det gør det faktisk. Jeg skal lige vænne mig til at mange ting
> skal converteres til strenge før de kan bruges i fx Labels etc ... det er
> man jo ikke ligefrem vant til i ASP :)

Nej, men det er et kæmpe plus, og en af de umiddelbare følger er at man
slipper for meget inputvalidering, f.eks. er det ikke muligt at en bruger
kan sende en streng med i URI'en istedet for et ID, og få det udført i
databasen, hvilket man jo må sige at valus[1] har lært på den hårde måde.

[1] <http://debat.computerworld.dk/debate.asp?Mode=1&DebateID=1779>

--
Jakob Andersen



Jesper Stocholm (26-05-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 26-05-02 16:22

Jakob Andersen wrote in news:acqtct$au6$1@sunsite.dk:

> "Jesper Stocholm" <spam200205@stocholm.dk> skrev i en meddelelse
> news:Xns921AAA7767543spamstocholmdk@130.226.1.34...
>> det kan du jo self. sige ... det var nu også mere strukturen i
>> XML-"markup"et jeg godt kan lide. Den anden metode med string-
>> concatenation er meget muligt mere optimal, men imo giver den utrolig
>> ulæselig kode ... :)
>
> Det var nu ikke ment som en tale for ikke at bruge repeateren, den er
> sikkert optimeret så meget at den er omtrent ligeså hurtig som at
> bruge en stringbuilder. Mit opstød kom mest af at XSLT hænger mig
> langt ud af halsen for tiden, de mest basale ting skal man oftest til
> at skrive sine egne funktioner(templates) til, og ofte ender man ud i
> nogle løsninger med at bruge "hacks" af en slags for at få XSLT til at
> makke ret.

det er desværre korrekt ... at arbejde med XSLT vil jeg næsten
sammenligne med at håndtere et hysterisk barn (eller kæreste?).
Man skal være ekstremt omhyggelig med at gøre det på den rigtige
måde første gang samt hele tiden have overblik over _hele_ koden
for at kunne debugge fejl.

>> jeg har ikke selv sat den blanke karakter ind ... den hiver selv den
>> blanke karakter med ud i SQL-kaldet. Det gør MSSQL jo da vist også
>
> Det mener jeg nu ikke, men det skal jeg nok ikke gøre mig klog på.

for noget tid siden lavede jeg noget kalender-hejs, hvor data blev
(ukritisk) hentet ud fra en MSSQL-tabel. Et eksempel på den
resulterende HTML er fx

<tr>
<td>Kontaktemail</td><td><a href="mailto:user@domain.dk ">user@domain.dk </a></td>
</tr>

Så vidt jeg kan huske, så er feltet defineret som VARCHAR(50)

> Nej, men det er et kæmpe plus, og en af de umiddelbare følger er at
> man slipper for meget inputvalidering, f.eks. er det ikke muligt at en
> bruger kan sende en streng med i URI'en istedet for et ID, og få det
> udført i databasen, hvilket man jo må sige at valus[1] har lært på den
> hårde måde.
>
> [1] <http://debat.computerworld.dk/debate.asp?Mode=1&DebateID=1779>
>

ja .. det er ret skræmmende ... men som den person jeg nu engang er, så
har jeg allede tilmeldt mig og købt mit første lovlige MP3-nummer via
mymusic.dk (Swan Lee).

.... jeg kunne i øvrigt se, at du heller ikke kunne nære dig for at blande
dig i mudderkastningen ... :)


--
Jesper Stocholm
http://stocholm.dk
http://asp.stocholm.dk
Svar til gruppen og ikke til mig privat pr. email :|

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste