Hur får jag fram värdet ur en <%# DataBinder.Eval(Container.DataItem, "Name") %> när det ligger i en tag?
Jag har inga problem att få fram värdet i tex en tabellcell, men om jag vill ha fram värdet i t ex <asp:hyperlink navigateurl, hur gör jag då???
Själv har jag nästan helt slutat med att använda DataBinder.Eval(Container.DataItem, "Name") ...
om du kikar på tex en DataGrid så finns eventet ItemDataBound som triggas av datagridens egenskap, OnItemDataBound
Då kan du köra tex:
Sub MySub_DataBound(Sender as Object, E As DataGridItemEventArgs)
_ctrl As Control = FindControl("ctrlName")
If (Not _ctrl Is Nothing) Then
Dim _hlnkCtrl As HyperLink = CType(_ctrl, HyperLink)
'## -- sätt värde --
_hlnkCtrl.NavigateURL = "www.mysite.com"
'## -- hämta värde --
Dim strNaviageURL As String = _hlnkCtrl.NavigateURL
End If
End Sub
på datagriden (i detta fall):
<asp:datagrid id="myDg" OnItemDataBound="MySub_DataBound" runat="server">[i].. massa andra kontroller ..[/i]</asp:datagrid>
och på det sättet plocka ut värden eller sätta värden på olika kontroller. Även skapa kontroller on the fly så att säga och lägga till dem till en "cell" i datagriden/datalisten/repeatern osv.
Nu vet jag inte riktigt vad du menar med att få "ut värdet" i detta påstående:
men om jag vill ha fram värdet i t ex <asp:hyperlink navigateurl, hur gör jag då???
Ett exempel där du sätter naviagateURL:
<%@ Page Language="VB" %>
<script runat="server">
Private Sub Page_Load(sender As Object, e As EventArgs)
Dim _infoCol As New InfoCollection()
Dim _info As New Info()
_info.Email = "mailto:mrwize@mrwize.nu"
_infoCol.Add(_info)
dgTest.DataSource = _infoCol
dgTest.DataBind()
End Sub
Public Sub Bound_ItemData(Sender As Object, E As DataGridItemEventArgs)
Select Case e.Item.ItemType
Case ListItemType.Item, ListItemType.AlternatingItem
Try
Dim _ctrl As Control = e.Item.FindControl("AnswerByMail")
Dim _hlnkCtrl As HyperLink = CType(_ctrl, HyperLink)
If (Not _hlnkCtrl Is Nothing) Then
Dim _info As Info = CType(e.Item.DataItem, Info)
_hlnkCtrl.NavigateURL = _info.Email
End If
Catch ex as exception
throw ex
End Try
End Select
End Sub
'## -- testclasses --
Public Class Info
Private m_email As String
Public Property Email() As String
Get
Return m_email
End Get
Set(ByVal Value as String)
m_email = Value
End Set
End Property
Public Sub New()
End Sub
End Class
Public Class InfoCollection
Inherits ArrayList
Public Sub New()
End Sub
End Class
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp:DataGrid id="dgTest" runat="server" OnItemDataBound="Bound_ItemData" AutoGenerateColumns="False">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<asp:hyperlink id='AnswerByMail' cssclass='imgemail' runat='server'>
<asp:image imageurl='img/email.gif' alternatetext='skicka epost till skribenten.' runat='server' />
</asp:hyperlink>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
</asp:DataGrid>
</form>
</body>
</html>
Varför du ska "hämta värdet" och vad du ska göra med det hämtade värdet får du förklara. Nu ser du hur man gör när man sätter ett värde, utan att använda DataBinder.Eval....
Vad du gör med värdet i subben, i detta fall, Bound_ItemData är upp till dig.
Förstår inte riktigt heller, jag tolkar det som så att du vill lägga in <%# DataBinder.Eval(Container.DataItem, "Name") %> i NavigateUrl vilket borde fungera utan några som helst problem. Observera dock att det blir problem om du lägger in 'mailto:<%# DataBinder.Eval(Container.DataItem, "Name") %>' då måste du göra så här '<%# DataBinder.Eval(Container.DataItem, "Name","mailto:{0}") %>'
Ni har rätt båda två.......
Tanken vara att jag tänkte använda mig av metoden som PatrikB använde, den utan Databinder.Eval
Men som läget är nu så kör jag vidare på den ändå.
ok, men här får du "all kod" för mitt exempel och med din datalist ....
<%@ Page Language="VB" Debug="True" %>
<script runat="server">
Private Sub Page_Load(sender As Object, e As EventArgs)
Dim _messCol As New ArrayList()
Dim _mess As New Message()
_mess.ID = 1
_mess.Name = "Patrik Berggren"
_mess.Email = "mailto:mrwize@mrwize.nu"
_mess.Url = "http://www.mrwize.nu"
_mess.Mess = "Detta är mitt meddelande, för stunden."
_messCol.Add(_mess)
_mess = New Message()
_mess.ID = 2
_mess.Name = "icaaq"
_mess.Email = ""
_mess.Url = ""
_mess.Mess = "icaaq säger: ""Aha ...."""
_messCol.Add(_mess)
dList.DataSource = _messCol
dList.DataBind()
End Sub
Public Sub Message_BoundData(Sender As Object, E As DataListItemEventArgs)
Select Case e.Item.ItemType
Case ListItemType.Item, ListItemType.AlternatingItem
'## -- hitta controllen för namn --
Dim _ctrlName As Control = e.Item.FindControl("litName")
If (Not _ctrlName Is Nothing) Then
Dim _name As Literal = CType(_ctrlName, Literal)
_name.Text = CType(e.Item.DataItem, Message).Name
End If
'## -- hitta controllen för email --
Dim _ctrlEmail As Control = e.Item.FindControl("AnswerByMail")
If (Not _ctrlEmail Is Nothing) Then
Dim _mail As HyperLink = CType(_ctrlEmail, HyperLink)
Dim strEmail As String = CType(e.Item.DataItem, Message).Email
If (strEmail.Length > 0) Then
_mail.Visible = True
_mail.NavigateURL = strEmail
'## -- hitta länkbilden till urlen --
Dim _ctrlEmailImg As Control = e.Item.FindControl("imgEmail")
If (Not _ctrlEmailImg Is Nothing) Then
Dim _imgEmail As System.Web.UI.WebControls.Image = CType(_ctrlEmailImg, System.Web.UI.WebControls.Image)
_imgEmail.Visible = True
End If
End If
End If
'## -- hitta controllen för url --
Dim _ctrlUrl As Control = e.Item.FindControl("GoToHomepage")
If (Not _ctrlUrl Is Nothing) Then
Dim _url As HyperLink = CType(_ctrlUrl, HyperLink)
Dim strUrl As String = CType(e.Item.DataItem, Message).Url
If (strUrl.Length > 0) Then
_url.Visible = True
_url.NavigateURL = strUrl
'## -- hitta länkbilden till urlen --
Dim _ctrlUrlImg As Control = e.Item.FindControl("imgUrl")
If (Not _ctrlUrlImg Is Nothing) Then
Dim _imgUrl As System.Web.UI.WebControls.Image = CType(_ctrlUrlImg, System.Web.UI.WebControls.Image)
_imgUrl.Visible = True
End If
End If
End If
'## -- hitta controllen för meddelandet --
Dim _ctrlMess As Control = e.Item.FindControl("litMessage")
If (Not _ctrlMess Is Nothing) Then
Dim _mess As Literal = CType(_ctrlMess, Literal)
_mess.Text = CType(e.Item.DataItem, Message).Mess
End If
End Select
End Sub
Public Class Message
Private m_messageID As Integer
Private m_name As String
Private m_email As String
Private m_url As String
Private m_message As String
Public Property ID() As Integer
Get
Return m_messageID
End Get
Set(ByVal Value As Integer)
m_messageID = Value
End Set
End Property
Public Property Name() As String
Get
Return m_name
End Get
Set(ByVal Value As String)
m_name = Value
End Set
End Property
Public Property Email() As String
Get
Return m_email
End Get
Set(ByVal Value As String)
m_email = Value
End Set
End Property
Public Property Url() As String
Get
Return m_url
End Get
Set(ByVal Value As String)
m_url = Value
End Set
End Property
Public Property Mess() As String
Get
Return m_message
End Get
Set(ByVal Value As String)
m_message = Value
End Set
End Property
Public Sub New()
End Sub
End Class
</script>
<html>
<head>
</head>
<body>
<form runat="server">
<asp:datalist id="dList" runat="server" OnItemDataBound="Message_BoundData">
<itemtemplate>
<asp:table runat="server">
<asp:tablerow>
<asp:tablecell cssclass='name'>
<asp:Literal id="litName" runat="server"></asp:Literal>
<asp:hyperlink id='AnswerByMail' cssclass='imgemail' runat='server' visible="False">
<asp:image id="imgEmail" visible="False" imageurl='img/email.gif' alternatetext='skicka epost till skribenten.' runat='server' />
</asp:hyperlink>
<asp:hyperlink id='GoToHomepage' cssclass='imgehome' visible="False" runat='server'>
<asp:image id="imgUrl" visible="False" imageurl='img/home.gif' alternatetext='Skribentens hemsida.' runat='server' />
</asp:hyperlink>
</asp:tablecell>
<asp:tablecell cssclass='datetime'>
<asp:Literal id="litDateTime" runat="server"></asp:Literal>
</asp:tablecell>
</asp:tablerow>
<asp:tablerow>
<asp:tablecell columnspan='2' cssclass='message'>
<asp:Literal id="litMessage" runat="server"></asp:Literal>
</asp:tablecell>
</asp:tablerow>
</asp:table>
</itemtemplate>
<separatortemplate>
<hr />
</separatortemplate>
</asp:datalist>
</form>
</body>
</html>
Det intressanta är subben, Message_BoundData. Det är där "allt händer"
Som du ser så gömmer man lätt länkar och tillhörande bilder på ett mycket smidigt sätt när de inte har data.
Nu så ser det inte snyggt ut, utan man bör göra metoder istället för att ha all kod i subben Message_BoundData
labba lite och bli bekant med användandet så kommer du säkert på andra användningsområden + att du får konvertera över denna kod till C# :e