Archief - control toevoegen in asp literal in .net (TOUGH ONE!)

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

nickyboy

Legacy Member
Ik wil dus in een via een literal controleren of iets true or false is, afhangelijk daarvan moet ofwel een 'x' ofwel een button op de pagina komen.

de x op de pagina werkt, maar de button komt er niet op, waarschijnlijk omdat een text clientside werkt en een button serverside...

de literal zit ook al in een listview, de listview haal ik op via de eval functie... (dit is hier niet zo belangrijk denk ik maar wou het toch even mede delen)

iemand enig idee hoe ik de button op de pagina kan krijgen?

hier is mijn code:

<ItemTemplate runat="server">
<tr id="row" runat="server">
<td> <a href=<%# "detailrooster.aspx?DagID=" & Eval("DagID") %>><%#Eval("Datum").ToString.Substring(0, 9)%></a> </td>

<td> <%#Eval("Uur")%></td>
<td> <%#Eval("Naam")%></td>
<td align="center"><asp:Literal ID="LiteralBevestigd" runat="server" /> </td>
<td align="center"><asp:Literal ID="LiteralAfgekeurd" runat="server" /> </td>

</tr>

</ItemTemplate>


Private Sub Listview1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs)
Dim LiteralBevestigd As Literal = e.Item.FindControl("LiteralBevestigd")
Dim LiteralAfgekeurd As Literal = e.Item.FindControl("LiteralAfgekeurd")
'dim myliteral as literal = CTYPE(sender,listview1)
Dim lvdiContainer As ListViewDataItem = CType(LiteralBevestigd.NamingContainer, ListViewDataItem)
Dim bevestigd As String = DataBinder.Eval(lvdiContainer.DataItem, "Bevestigd").ToString()
Dim afgekeurd As String = DataBinder.Eval(lvdiContainer.DataItem, "Afgekeurd").ToString()




If afgekeurd.Equals("False") And bevestigd.Equals("False") Then

LiteralAfgekeurd.Text &= String.Format(" <asp:Button ID=" & Chr(34) & "Button1" & Chr(34) & "runat=" & Chr(34) & "server" & Chr(34) & " Text=" & Chr(34) & "Button" & Chr(34) & " onclick=" & Chr(34) & "Button1_Click" & Chr(34) & "/> ", e.Item.ID)
LiteralBevestigd.Text &= "<asp:Button ID='Button2'runat='server' Text='Button' onclick='Button1_Click'/> "


Else

If bevestigd.Equals("True") Then
LiteralBevestigd.Text &= "x"
Else
LiteralAfgekeurd.Text &= "x"
End If

End If

End Sub

Obliv`

Legacy Member
Wat je daar zegt van text = clientside en button = serverside is totaal fout.

Om die knop op in je listview te krijgen kan je:
1) Een placeholder op de plek zetten waar die knop juist moet komen. Vervolgens voeg je de knop in je OnItemDataBound eventhandler toe aan de controls collection van die placeholder (let wel, bij elke postback moet je dynamisch toegevoegde controls terug toevoegen aan de pagina (+ events hoocken indien nodig).
2) Je kan het ook makkelijk doen en die knop in je markup al gewoon toevoegen. In je OnItemDataBound zet je ze gewoon visible/hidden afhankelijk van de vereisten.

Ahja, ipv dit:
Dim lvdiContainer As ListViewDataItem = CType(LiteralBevestigd.NamingContainer, ListViewDataItem)

kan je beter zoiets doen:
ListViewDataItem dataItem = ((ListViewDataItem)(e.Item.DataItem));

nickyboy

Legacy Member
probleem is dat de button dynamisch moet toegevoegd worden voor elke rij die in de listview staat...

dus ik kan hem niet vooraf definiëren denk ik...

Obliv`

Legacy Member
nickyboy zei:
probleem is dat de button dynamisch moet toegevoegd worden voor elke rij die in de listview staat...

dus ik kan hem niet vooraf definiëren denk ik...

Je hoeft juist niks dynamisch toe te voegen als je de knoppen al gewoon definieerd in je mark up:

Code:
<ItemTemplate runat="server">
<tr id="row" runat="server">
<td> <a href=<%# "detailrooster.aspx?DagID=" & Eval("DagID") %>><%#Eval("Datum").ToString.Substring(0, 9)%></a> </td>

<td> <%#Eval("Uur")%></td>
<td> <%#Eval("Naam")%></td>
<td align="center"><asp:Literal ID="LiteralBevestigd" runat="server" /> </td>
<td align="center"><asp:Literal ID="LiteralAfgekeurd" runat="server" /> </td>
[COLOR="Magenta"][B]<td align="center"><asp:Button ID="ExampleButton" runat="server" Text="Button" CommandName="Example" CommandArgument='<%#Eval("IetsWatJeWilDoorgevenBijHetKlikkenOpDezeKnopInDezeRij")%>' Visible="false" /> </td>[/B][/COLOR]
</tr>
</ItemTemplate>

Ik heb hierboven ExampleButton in jouw item template toegevoegd.
Btw, heb je die runat="server" op je tr-tag wel nodig?

Dan de codebehind:
Code:
Private Sub Listview1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemEventArgs)
Dim LiteralBevestigd As Literal = e.Item.FindControl("LiteralBevestigd")
Dim LiteralAfgekeurd As Literal = e.Item.FindControl("LiteralAfgekeurd")
[COLOR="Magenta"][B]Dim ExampleButton As Button = e.Item.FindControl("ExampleButton")[/B][/COLOR]

Dim lvdiContainer As ListViewDataItem = CType(LiteralBevestigd.NamingContainer, ListViewDataItem)
Dim bevestigd As String = DataBinder.Eval(lvdiContainer.DataItem, "Bevestigd").ToString()
Dim afgekeurd As String = DataBinder.Eval(lvdiContainer.DataItem, "Afgekeurd").ToString()

If afgekeurd.Equals("False") And bevestigd.Equals("False") Then
[COLOR="Magenta"]ExampleButton.Visible = True[/COLOR]
Else

If bevestigd.Equals("True") Then
LiteralBevestigd.Text &= "x"
Else
LiteralAfgekeurd.Text &= "x"
End If

End If

End Sub

Dan nog een extra eventhandler voor uw ItemCommand event van uw listview om het klikken op de knop op te vangen.

Code:
Private Sub Listview1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.ListViewItemCommandEventArgs)
Select Case e.CommandName
Case "Example"
'Example is de commandname die we in de markup op de knop hebben gezet
MyClass.DoSomethingWithMyArgument(e.CommandArgument)
End Select

Voila zo zou het ongeveer moeten zijn. De code die ik heb aangepast heeft een ander kleurtje. Ik heb alles met de losse hand getypt dus er kunnen wel wat fouten inzitten.

nickyboy

Legacy Member
mooi! hiermee is mijn probleem bijna opgelost

laatste issue; die button die eerst visible false is die staat natuurlijk niet op de juiste plaats in de tabel als ik hem op visible true zet...

eigenlijk zou op die moment de button op de plaats van de literal moeten komen... (of de literal gewoon weg zodat alles opschuift) eigenlijk hoef ik dan ook geen literal meer maar kan ik ook gewoon een label nemen maar dat lost mijn probleem niet op...

iemand een idee?

opgelost!
ipv

<td> <%#Eval("Uur")%></td>
<td> <%#Eval("Naam")%></td>
<td align="center"><asp:Literal ID="LiteralBevestigd" runat="server" /> </td>
<td align="center"><asp:Literal ID="LiteralAfgekeurd" runat="server" /> </td>
<td align="center"><asp:Button ID="ExampleButton" runat="server" Text="Button" CommandName="Example" CommandArgument='<%#Eval("IetsWatJeWilDoorgevenBijHetKlikkenOpDezeKnopInDezeRij")%>' Visible="false" /> </td>


moest het dit zijn:
<td> <%#Eval("Uur")%></td>
<td> <%#Eval("Naam")%></td>
<td align="center"><asp:Literal ID="LiteralBevestigd" runat="server" /> </td>
<td align="center"><asp:Literal ID="LiteralAfgekeurd" runat="server" /> <asp:Button ID="ExampleButton" runat="server" Text="Button" CommandName="Example" CommandArgument='<%#Eval("IetsWatJeWilDoorgevenBijHetKlikkenOpDezeKnopInDezeRij")%>' Visible="false" /></td>
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan