|
| [ASP.NET, VB] Linjeskift i et datagrid Fra : Jens Gyldenkærne Cla~ |
Dato : 18-11-02 13:17 |
|
Hvordan får man lettest vist linjeskift i et datagrid? I normal asp
bruger man bare replace(str, vbNewLine, vbNewline & "<br>") , men
hvad gør jeg i .net?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Jesper Stocholm (18-11-2002)
| Kommentar Fra : Jesper Stocholm |
Dato : 18-11-02 13:37 |
|
Jens Gyldenkærne Clausen wrote :
> Hvordan får man lettest vist linjeskift i et datagrid? I normal asp
> bruger man bare replace(str, vbNewLine, vbNewline & "<br>") , men
> hvad gør jeg i .net?
Jeg er ikke helt klar over, hvordan du kombinerer det med .Bind(), som
jeg antager, at du bruger til at putte data i dit grid, men til
string-objektet i .Net hører der en Replace()-metode.
dvs:
dim str as string
str = "<streng indeholdende linieskift>"
str.Replace(VbCrLf,"<br>")
MEN: jeg koder ikke i VB.Net, så det er med forbehold for fejl. Hvis det var i C#, så ville det være
string str;
str = "<streng indeholdende linieskift>";
str.Replace("\n","<br>");
Se i øvrigt http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemStringClassReplaceTopic.asp?frame=true
.... håber, at det trods alt hjalp lidt :)
--
Jesper Stocholm
http://stocholm.dk
Ny FAQ for dk.edb.internet.webdesign.serverside.asp
se http://asp-faq.dk
| |
Jens Gyldenkærne Cla~ (18-11-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 18-11-02 14:08 |
|
Jesper Stocholm skrev:
> Jeg er ikke helt klar over, hvordan du kombinerer det med
> .Bind(), som jeg antager, at du bruger til at putte data i dit
> grid, men til string-objektet i .Net hører der en
> Replace()-metode.
Indtil nu har jeg blot haft følgende:
Sub BindData()
Dim DS As DataSet
Dim MyCommand As SQLDataAdapter
MyCommand = New SQLDataAdapter(SQLStatement.Text,
MyConnection)
DS = new DataSet()
MyCommand.Fill(DS, "Tekster_Kladde")
MyDataGrid.DataSource =
DS.Tables("Tekster_Kladde").DefaultView
MyDataGrid.DataBind()
End Sub
- og så ladet datagrid'et om at fylde rækker og kolonner. Nu er jeg
gået over til at definere kolonnerne selv
(AutoGenerateColumns="False").
Jeg forsøgte med:
<asp:BoundColumn DataField="replace(tekst, vbNewLine, vbNewline &
'<br>')" HeaderText="Tekst" />
- men det virker ikke.
Er jeg nødt til at lave erstatningskoden på sql-serveren?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Jesper Stocholm (18-11-2002)
| Kommentar Fra : Jesper Stocholm |
Dato : 18-11-02 14:25 |
|
Jens Gyldenkærne Clausen wrote :
> Jesper Stocholm skrev:
>
>> Jeg er ikke helt klar over, hvordan du kombinerer det med
>> .Bind(), som jeg antager, at du bruger til at putte data i dit
>> grid, men til string-objektet i .Net hører der en
>> Replace()-metode.
>
> Indtil nu har jeg blot haft følgende:
>
> Sub BindData()
>
> Dim DS As DataSet
> Dim MyCommand As SQLDataAdapter
>
> MyCommand = New SQLDataAdapter(SQLStatement.Text,
> MyConnection)
så vidt jeg husker fra referencen fra .Net Framework, så anbefales det,
at man anvender en DataReader, hvis der skal itereres over en mængde
data (fx rækker i et resultat i en database).
> DS = new DataSet()
> MyCommand.Fill(DS, "Tekster_Kladde")
>
>
> MyDataGrid.DataSource =
> DS.Tables("Tekster_Kladde").DefaultView
> MyDataGrid.DataBind()
> End Sub
>
> - og så ladet datagrid'et om at fylde rækker og kolonner. Nu er jeg
> gået over til at definere kolonnerne selv
> (AutoGenerateColumns="False").
ja ... se længere nede ...
> Jeg forsøgte med:
>
> <asp:BoundColumn DataField="replace(tekst, vbNewLine, vbNewline &
> '<br>')" HeaderText="Tekst" />
>
> - men det virker ikke.
>
> Er jeg nødt til at lave erstatningskoden på sql-serveren?
nej ... det kan jeg ikke forestille mig. Jeg er dog personligt gået
fra at anvende disse grids til at putte data i tabeller (det er det,
som du ønsker , ikke ?) - men i stedet at anvende en Repeater til det.
Det giver mig imo mere kontrol over layoutet af tabellen etc, der
indeholder data.
Følgende er kode fra asp-faq.dk, der putter data i tabellen på forsiden i
"5 nyeste artikler"
Det er godt nok med ODBC.Net og i c#, men jeg tror godt, at du kan
se idéen (det er renset for formattering etc).
<asp:Repeater id="rNewArticles" runat="server">
<HeaderTemplate>
<table>
<tr>
<td>
5 nyeste artikler
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem, "subHeadline").ToString()) %>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
Her puttes data ud ved fx
<%# DataBinder.Eval(Container.DataItem, "id") %>
I dit tilfælde vil du kunne udskifte linieskift i c# med
<%# DataBinder.Eval(Container.DataItem, "id").ToString().Replace("\n","<br>") %>
Koden på serversiden er:
string strSQL = "SELECT subHeadLine FROM Table1";
OdbcDataReader oData = oDb.getData(strSQL); //oDb er en ekstern klasse
//til db-adgang
rNewArticles.DataSource = oData;
rNewArticles.DataBind();
Grunden til at jeg anvender en Repeater er fortrinsvist, at det er
nemmere at "flette" data ind i fx et a-element med en Repeater, og så
kan jeg personligt godt lide, at opbygningen af output er så
"xml-ificeret" mht HeaderTemplate, ItemTemplate etc.
og ja, jeg beklager, at det ikke er i VB.Net ... :) ...
--
Jesper Stocholm
http://stocholm.dk
Ny FAQ for dk.edb.internet.webdesign.serverside.asp
se http://asp-faq.dk
| |
Kim Bach Petersen (18-11-2002)
| Kommentar Fra : Kim Bach Petersen |
Dato : 18-11-02 18:48 |
|
Nu ved jeg ikke, om du er 'hoppet på' repeater'en, men alligevel...
> Er jeg nødt til at lave erstatningskoden på sql-serveren?
Nej, uden at være ekspert i datagrids, så ser jeg grundlæggende tre
muligheder:
1. Gennemløbe datasættet før det bindes til MyDataGrid og erstatte.
2. Gennemløbe under selv bindingen.
3. Gennemløbe MyDataGrid efter databindingen.
Løsning 1 vil umiddelbart være det letteste, mens de to andre nok mest
kommer på tale, når der skal mere komplicerede operationer til (som at
tilføje controls indeni datagrids celler).
Indsat i din kode vil det give noget i stil med:
DS = new DataSet()
MyCommand.Fill(DS, "Tekster_Kladde")
Dim iRow As DataRow
For Each iRow In DS.Tables("Tekster_Kladde").Rows
iRow.item("Kolonnenavn") = iRow.item("Kolonnenavn").replace(vbNewLine,
vbNewline & '<br>')
Next
MyDataGrid.DataSource = DS.Tables("Tekster_Kladde").DefaultView
MyDataGrid.DataBind()
Til løsning 2 og 3 bruges metoderne DataGrid.OnItemDataBound og
DataGrid.ItemCreated, men dem har du nok lyst til at vente lidt med... -
ellers bare sprøg!
Kim
| |
Jens Gyldenkærne Cla~ (18-11-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 18-11-02 14:23 |
|
Jesper Stocholm skrev:
> Jeg er ikke helt klar over, hvordan du kombinerer det med
> .Bind(), som jeg antager, at du bruger til at putte data i dit
> grid, men til string-objektet i .Net hører der en
> Replace()-metode.
Jeg kender udmærket Replace - men jeg kan ikke placere den korrekt.
Det kan ikke køres på sql-serveren, da replace-metoden (T-SQL) ikke
virker på ntext-felter.
Direkte i boundcolumn-feltet virker det heller ikke, så jeg må
skulle sætte et eller andet i databind-delen. Men her har jeg ikke
defineret nogle feltnavne - replacemetoden skal jo kun køres på ét
felt.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Jens Gyldenkærne Cla~ (18-11-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 18-11-02 14:02 |
|
Jesper Stocholm skrev:
> Jeg er ikke helt klar over, hvordan du kombinerer det med
> .Bind(), som jeg antager, at du bruger til at putte data i dit
> grid, men til string-objektet i .Net hører der en
> Replace()-metode.
Indtil nu har jeg blot haft følgende:
Sub BindData()
Dim DS As DataSet
Dim MyCommand As SQLDataAdapter
MyCommand = New SQLDataAdapter(SQLStatement.Text,
MyConnection)
DS = new DataSet()
MyCommand.Fill(DS, "Tekster_Kladde")
MyDataGrid.DataSource =
DS.Tables("Tekster_Kladde").DefaultView
MyDataGrid.DataBind()
End Sub
- og så ladet datagrid'et om at fylde rækker og kolonner. Nu er jeg
gået over til at definere kolonnerne selv
(AutoGenerateColumns="False").
Jeg forsøgte med:
<asp:BoundColumn DataField="replace(tekst, vbNewLine, vbNewline &
'<br>')" HeaderText="Tekst" />
- men det virker ikke.
Er jeg nødt til at lave erstatningskoden på sql-serveren?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Jens Gyldenkærne Cla~ (18-11-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 18-11-02 14:35 |
|
Jesper Stocholm skrev:
>> MyCommand = New SQLDataAdapter(SQLStatement.Text,
>> MyConnection)
>
> så vidt jeg husker fra referencen fra .Net Framework, så
> anbefales det, at man anvender en DataReader, hvis der skal
> itereres over en mængde data (fx rækker i et resultat i en
> database).
Som jeg har læst det skal (bør) datareaderen anvendes hvis man ikke
skal redigere data. Det får jeg brug for her.
> Jeg er dog personligt gået fra at anvende disse grids til at
> putte data i tabeller (det er det, som du ønsker , ikke ?)
Jo.
- men i stedet at anvende
> en Repeater til det. Det giver mig imo mere kontrol over
> layoutet af tabellen etc, der indeholder data.
Den vil jeg prøve. Hvordan har repeateren det med sortering og
paginering af datasæt (som jeg lige havde fået op at stå med
datagrid)?
> Det er godt nok med ODBC.Net og i c#, men jeg tror godt, at du
> kan se idéen (det er renset for formattering etc).
Bestemt. Forskellen mellem C# og VB er ikke større end at jeg bør
kunne lave erstatningskode selv.
> <%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem,
> "subHeadline").ToString()) %> </td>
Hvad dækker <%# ... %> over? (Har set den et par gange nu).
Og er det nødvendigt at benytte .ToString når datafeltet er et
tekstfelt?
> Grunden til at jeg anvender en Repeater er fortrinsvist, at
> det er nemmere at "flette" data ind i fx et a-element med en
> Repeater,
Er det ikke det man kan gøre med en template i et datagrid? (det er
et skud i tågen - jeg er lysegrøn i .net-sammenhæng).
> og ja, jeg beklager, at det ikke er i VB.Net ... :) ...
Det skal du ikke. Det er ikke forskelle mellem .net/c# og .net/vb
der volder problemer.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Jesper Stocholm (18-11-2002)
| Kommentar Fra : Jesper Stocholm |
Dato : 18-11-02 14:42 |
|
Jens Gyldenkærne Clausen wrote :
> Jesper Stocholm skrev:
>
>>> MyCommand = New SQLDataAdapter(SQLStatement.Text,
>>> MyConnection)
>>
>> så vidt jeg husker fra referencen fra .Net Framework, så
>> anbefales det, at man anvender en DataReader, hvis der skal
>> itereres over en mængde data (fx rækker i et resultat i en
>> database).
>
> Som jeg har læst det skal (bør) datareaderen anvendes hvis man ikke
> skal redigere data. Det får jeg brug for her.
ok ... :) Det var jeg ikke klar over.
> - men i stedet at anvende
>> en Repeater til det. Det giver mig imo mere kontrol over
>> layoutet af tabellen etc, der indeholder data.
>
> Den vil jeg prøve. Hvordan har repeateren det med sortering og
> paginering af datasæt (som jeg lige havde fået op at stå med
> datagrid)?
Det ved jeg faktisk ikke ... og specielt paging er faktisk på min todo-
liste over udforskning af en Repeaters anvendelsesmuligheder.
>> Det er godt nok med ODBC.Net og i c#, men jeg tror godt, at du
>> kan se idéen (det er renset for formattering etc).
>
> Bestemt. Forskellen mellem C# og VB er ikke større end at jeg bør
> kunne lave erstatningskode selv.
>> <%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem,
>> "subHeadline").ToString()) %> </td>
>
> Hvad dækker <%# ... %> over? (Har set den et par gange nu).
> Og er det nødvendigt at benytte .ToString når datafeltet er et
> tekstfelt?
<%# %> er en slags direkte flettemekanisme i .Net ... ligesom det kendes
fra reg. ASP. Mht ToString(), så er det ikke nødvendigt, hvis data blot
skal udskrives i en repeater, men metoderne Replace() og Trim() kræver,
at der eksplicit er converteret til en streng, ellers giver den en fejl.
>> Grunden til at jeg anvender en Repeater er fortrinsvist, at
>> det er nemmere at "flette" data ind i fx et a-element med en
>> Repeater,
>
> Er det ikke det man kan gøre med en template i et datagrid? (det er
> et skud i tågen - jeg er lysegrøn i .net-sammenhæng).
måske ... jeg kender som sagt heller ikke Repeater helt endnu ... jeg har
blot vurderet, at jeg hurtigere kunne komme videre med at lave fletning
af data i a-elementer etc ved at bruge en Repeater end at skulle
fremgrave data om, hvordan man tweaker et grid til at gøre det samme.
>> og ja, jeg beklager, at det ikke er i VB.Net ... :) ...
>
> Det skal du ikke. Det er ikke forskelle mellem .net/c# og .net/vb
> der volder problemer.
:)
--
Jesper Stocholm
http://stocholm.dk
Ny FAQ for dk.edb.internet.webdesign.serverside.asp
se http://asp-faq.dk
| |
Jakob Andersen (18-11-2002)
| Kommentar Fra : Jakob Andersen |
Dato : 18-11-02 14:56 |
|
"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote
> Som jeg har læst det skal (bør) datareaderen
> anvendes hvis man ikke skal redigere data.
> Det får jeg brug for her.
Det kommer an på om du ønsker at redigere dataene i grid'et eller direkte i
databasen.
> Den vil jeg prøve. Hvordan har repeateren det med sortering og
> paginering af datasæt (som jeg lige havde fået op at stå med
> datagrid)?
Ikke så godt, men du løber på et eller andet tidspunkt ind i nogle problemer
med datagrid'et som gør at du laver din egen gridcontrol.
> Er det ikke det man kan gøre med en template i et datagrid? (det er
> et skud i tågen - jeg er lysegrøn i .net-sammenhæng).
Jo, men repeateren er bedre performancemæssigt.
--
Jakob Andersen
| |
Jens Gyldenkærne Cla~ (18-11-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 18-11-02 14:46 |
|
Jesper Stocholm skrev:
> <%# %> er en slags direkte flettemekanisme i .Net ... ligesom
> det kendes fra reg. ASP.
Altså svarende til <%= %> i asp? Kan den bruges overalt eller er
der særlige restriktioner?
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Jakob Andersen (18-11-2002)
| Kommentar Fra : Jakob Andersen |
Dato : 18-11-02 14:57 |
| | |
Jens Gyldenkærne Cla~ (18-11-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 18-11-02 14:59 |
| | |
Jens Gyldenkærne Cla~ (18-11-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 18-11-02 21:42 |
|
Kim Bach Petersen skrev:
> Nu ved jeg ikke, om du er 'hoppet på' repeater'en, men
> alligevel...
Ikke endnu - hver gang jeg skal lære en ny control går der lidt
ekstra tid ;)
> Dim iRow As DataRow
> For Each iRow In DS.Tables("Tekster_Kladde").Rows
> iRow.item("Kolonnenavn") =
> iRow.item("Kolonnenavn").replace(vbNewLine,
> vbNewline & '<br>')
> Next
Smukt. Det tog lige et par fejlsider at få erstattet '<br>' med
"<br>" - men så fungerer det også.
> Til løsning 2 og 3 bruges metoderne DataGrid.OnItemDataBound
> og DataGrid.ItemCreated, men dem har du nok lyst til at vente
> lidt med... - ellers bare sprøg!
Jeg er godt tilfreds med nr. 1 indtil videre - men hvis du har
energi til at forklare nr. 2 eller 3 er jeg lutter øren.
Foreløbig mange tak.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.
| |
Kim Bach Petersen (18-11-2002)
| Kommentar Fra : Kim Bach Petersen |
Dato : 18-11-02 22:36 |
|
> Jeg er godt tilfreds med nr. 1 indtil videre - men hvis du har
> energi til at forklare nr. 2 eller 3 er jeg lutter øren.
> Foreløbig mange tak.
Rent programmeringsmæssigt ligner nummer 2 og 3 hinanden meget, blot
benytter metoderne forskellige events.
Ser vi på metoden DataGrid.OnItemDataBound, så giver den os mulighed for at
afvikle kode i forbindelse med data bindes til datagrid'et. Koden, det vil
sige en sub-rutine, angives i tag'et:
<asp:DataGrid id="MyGrid" OnItemDataBound="DoThisOnItemBound" runat="server"
/>
og selve koden skrives (med det lille forbehold, at det er sengetid):
Sub DoThisOnItemBound(sender As Object, e As DataGridItemEventArgs)
e.Item.DataItem("Kolonnenavn") = e.Item.DataItem.replace(vbNewLine,
vbNewline & "<br>")
End Sub
Lidt mere omstændigt som det ses og nok mere relevant, hvis man vil knytte
javascripts til rækker/celler eller controls.
Kim
--
· www.kensho.dk · psykologi og spiritualitet ·
| |
Jakob Andersen (18-11-2002)
| Kommentar Fra : Jakob Andersen |
Dato : 18-11-02 23:07 |
|
"Kim Bach Petersen" <kim@kensho.dk> wrote
> Ser vi på metoden DataGrid.OnItemDataBound, så giver den os mulighed for
at
> afvikle kode i forbindelse med data bindes til datagrid'et. Koden, det vil
> sige en sub-rutine, angives i tag'et:
Det vil nok også være performancemæssigt bedre end at løbe igennem det hele
en gang til.
> e.Item.DataItem("Kolonnenavn") = e.Item.DataItem.replace(vbNewLine,
Er e.Item ikke readonly?
--
Jakob Andersen
| |
Kim Bach Petersen (19-11-2002)
| Kommentar Fra : Kim Bach Petersen |
Dato : 19-11-02 00:01 |
|
> Det vil nok også være performancemæssigt bedre end at løbe igennem
> det hele en gang til.
Måske, det kan jeg ikke lige gennemskue. OnItemDataBound kaldes jo for hver
række, men datasættet løbes selvfølgelig kun igennem ved bindingen...
> Er e.Item ikke readonly?
Jo - og så alligevel ikke: e.Item refererer til et objekt og det objektet
kan vi ikke udskifte, men selve objektet kan vi godt manipulere. Objektet er
af klassen DataGridItem, der arver System.Web.UI.WebControls.TableRow og kan
derfor tilgås og bearbejdes cirka som en almindelig TableRow.
Fx ville vi kunne tilføje et javascript, der highlight'er den række,
muse-cursor'en peger på:
e.Item.Attributes("onMouseOver","this.style.background='#f6f6f6'")
e.Item.Attributes("onMouseOut","this.style.background='#ffffff'")
Eller gøre hver anden række klikbar:
If e.Item.ItemStyle = ItemStyle.AlternatingItemStyle Then
e.Item.Attributes("onClick","alert('Hello World!')"
End If
Kombineret med FindControl vil man også kunne bruge denne teknik til at
tilgå controls indlejret i datagrids eller repeaters - og som det lader sig
ane giver det nye muligheder for at lave små fede detaljer.
Kim
--
· www.kensho.dk · psykologi og spiritualitet ·
| |
Jens Gyldenkærne Cla~ (19-11-2002)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 19-11-02 00:07 |
|
Kim Bach Petersen skrev:
> Ser vi på metoden DataGrid.OnItemDataBound, så giver den os
> mulighed for at afvikle kode i forbindelse med data bindes til
> datagrid'et.
> Sub DoThisOnItemBound(sender As Object, e As
> DataGridItemEventArgs)
> e.Item.DataItem("Kolonnenavn") =
> e.Item.DataItem.replace(vbNewLine,
> vbNewline & "<br>")
> End Sub
Skal der ikke et ("Kolonnenavn") ind efter lighedstegnet? (du havde
jo taget forbehold).
> Lidt mere omstændigt som det ses og nok mere relevant, hvis
> man vil knytte javascripts til rækker/celler eller controls.
Det virker nu ikke mere omstændeligt set herfra.
--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.
| |
|
|