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å???
DataBinder.Eval(Container.DataItem, "Name") %>
13 svar · 658 visningar · startad av icaaq
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.
cya,
PatrikB
Skulle nån vänlig själ kunna visa hur jag skulle kunna göra om denna tag till det som PatrikB pratar om:
[red]
<asp:hyperlink id='AnswerByMail' cssclass='imgemail' navigateurl='mailto:<%# DataBinder.Eval(Container.DataItem, "Email") %>' runat='server'><asp:image imageurl='img/email.gif' alternatetext='skicka epost till skribenten.' runat='server' /></asp:hyperlink>
[/red]
Mvh icaaq
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.
cya,
PatrikB
icaaq skrev:
<asp:hyperlink id='AnswerByMail' cssclass='imgemail' navigateurl='mailto:<%# DataBinder.Eval(Container.DataItem, "Email") %>' runat='server'> <asp:image imageurl='img/email.gif' alternatetext='skicka epost till skribenten.' runat='server' /> </asp:hyperlink>
Funkar inte detta då?
<asp:hyperlink id="AnswerByMail" cssclass="imgemail' navigateurl='<%# DataBinder.Eval(Container.DataItem, "Email","mailto:{0}") %>' runat="server">
<asp:image imageurl="img/email.gif" alternatetext="skicka epost till skribenten." runat="server" />
</asp:hyperlink>
Så här har jag nu:
[red]
public ArrayList RetriveMesseges()
{
ArrayList _arrList = new ArrayList();
string SqlStatement = "SELECT pk_id, f_name, f_datetime, f_email, f_url, f_message, f_comment from t_message ORDER BY pk_id DESC";
OdbcDataReader _dr = RetriveDataReader(SqlStatement);
while(_dr.Read())
{
Message m = new Message();
m.ID = Convert.ToInt16(_dr["pk_id"]);
m.Name = Convert.ToString(_dr["f_name"]);
m.Datetime = Convert.ToDateTime(_dr["f_datetime"]);
if(_dr["f_email"] != null)
{
m.Email = Convert.ToString(_dr["f_email"]);
}
if(_dr["f_url"] != null)
{
m.Url = Convert.ToString(_dr["f_url"]);
}
m.Mess = Convert.ToString(_dr["f_message"]);
if(_dr["f_comment"] != null)
{
m.Comment = Convert.ToString(_dr["f_comment"]);
}
_arrList.Add(m);
}
return _arrList;
}
------------------------------------------------------------------
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
Guestbook g = new Guestbook();
dList.DataSource = g.RetriveMesseges();
dList.DataBind();
}
------------------------------------------------------------------
<asp:datalist id='dList' runat='server'>
<itemtemplate>
<asp:table runat=server>
<asp:tablerow>
<asp:tablecell cssclass='name'><%# DataBinder.Eval(Container.DataItem, "Name") %> <asp:hyperlink id='AnswerByMail' cssclass='imgemail' navigateurl='<%# DataBinder.Eval(Container.DataItem, "Email","mailto:{0}") %>' runat='server'><asp:image imageurl='img/email.gif' alternatetext='skicka epost till skribenten.' runat='server' /></asp:hyperlink> <asp:hyperlink id='GoToHomepage' cssclass='imgehome' navigateurl='mailto:<%# DataBinder.Eval(Container.DataItem, "Url") %>' runat='server'><asp:image imageurl='img/home.gif' alternatetext='Skribentens hemsida.' runat='server'/></asp:hyperlink></asp:tablecell><asp:tablecell cssclass='datetime'><%# DataBinder.Eval(Container.DataItem, "Datetime", "{0:g}") %></asp:tablecell>
</asp:tablerow>
<asp:tablerow>
<asp:tablecell columnspan='2' cssclass='message'><%# DataBinder.Eval(Container.DataItem, "Mess") %></asp:tablecell>
</asp:tablerow>
</asp:table>
</itemtemplate>
<separatortemplate>
<hr />
</separatortemplate>
</asp:datalist>
[/red]
Som sagt så har jag kodat hitintills.....hur jag ska få grepp på PatriksB´s kod är ett annat kapitel ;)
Mvh icaaq
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å.
Tack båda två.
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
cya,
PatrikB
ok.....då har jag haft tid att läsa igenom detta tillslut. Så här långt har jag kommit:
*.aspx
[red]
<asp:datalist id='dList' runat='server' cssclass='dList' itemstyle-cssclass='dListCell' separatorstyle-cssclass='dListCellAlt' onitemdatabound='Message_BoundData'>
<itemtemplate>
<asp:panel cssclass='dHeadLeft' runat='server'><asp:label id='lblName' runat='server'/></asp:panel><asp:panel cssclass='dHeadRight' runat='server'><asp:hyperlink cssclass='imgemail' navigateurl='<%# DataBinder.Eval(Container.DataItem, "Email","mailto:{0}") %>' runat='server'><asp:image imageurl='img/email.gif' alternatetext='skicka epost till skribenten.' runat='server' /></asp:hyperlink><asp:hyperlink id='GoToHomepage' cssclass='imghome' navigateurl='<%# DataBinder.Eval(Container.DataItem, "Url", "{0}") %>' runat='server'><asp:image imageurl='img/home.gif' alternatetext='Skribentens hemsida.' runat='server'/></asp:hyperlink><%# DataBinder.Eval(Container.DataItem, "Datetime", "{0:d MMMM t}") %></asp:panel>
<asp:panel cssclass='dListMess' runat='server'><%# DataBinder.Eval(Container.DataItem, "Mess")%></asp:panel>
</itemtemplate>
<separatortemplate>
</separatortemplate>
</asp:datalist>
[/red]
*.aspx.cs
[red]
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Icaaq;
namespace guestbook
{
/// <summary>
/// Summary description for guestbook
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected Button addMess;
protected Button clearform;
protected Table Table1;
protected Label noname;
protected TextBox name;
protected TextBox headline;
protected TextBox email;
protected TextBox url;
protected TextBox message;
protected DataList dList;
protected LinkButton btnPrev;
protected LinkButton btnNext;
protected Guestbook g = new Guestbook();
protected PagedDataSource PagedData = new PagedDataSource();
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
PagedData.AllowPaging = true;
PagedData.DataSource = g.RetriveMessage();
PagedData.PageSize = 5;
try
{
PagedData.CurrentPageIndex = Convert.ToInt32(Request.QueryString["page"].ToString());
}
catch
{
PagedData.CurrentPageIndex = 0;
}
btnPrev.Visible = (!PagedData.IsFirstPage);
btnNext.Visible = (!PagedData.IsLastPage);
dList.DataSource = PagedData;
dList.DataBind();
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.addMess.Click += new System.EventHandler(this.addMess_Click);
this.clearform.Click += new System.EventHandler(this.clearform_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void addMess_Click(object sender, System.EventArgs e)
{
if(name.Text.Trim() == "" | message.Text.Trim() == "")
{
noname.Text = "Du måste fylla i namn och meddelande!!";
}
else
{
Guestbook g = new Guestbook();
g.AddMessage(name.Text, headline.Text, email.Text, url.Text, message.Text);
Response.Redirect(HttpContext.Current.Request.Url.ToString());
}
}
public void Prev_Click(object sender, System.EventArgs e)
{
Response.Redirect(Request.CurrentExecutionFilePath +"?page="+(PagedData.CurrentPageIndex - 1));
}
public void Next_Click(object sender, System.EventArgs e)
{
Response.Redirect(Request.CurrentExecutionFilePath +"?page="+(PagedData.CurrentPageIndex + 1));
}
public void Message_BoundData(object sender, DataListItemEventArgs e)
{
switch(e.Item.ItemType)
{
case ListItemType.Item:
case ListItemType.AlternatingItem:
Control _ctrl = e.Item.FindControl("lblName");
if(_ctrl != null)
{
Label _name = (Label)_ctrl;
[b]_name.Text = "s"; //här ligger problemet. Hur ska jag få fram värdet?[/b]
}
break;
}
}
}
[/red]
och guestbook.cs
[red]
public ArrayList RetriveMesseges()
{
ArrayList _arrList = new ArrayList();
string SqlStatement = "SELECT pk_id, f_name, f_datetime, f_email, f_url, f_message, f_comment from t_message ORDER BY pk_id DESC";
OdbcDataReader _dr = RetriveDataReader(SqlStatement);
while(_dr.Read())
{
Message m = new Message();
m.ID = Convert.ToInt16(_dr["pk_id"]);
m.Name = Convert.ToString(_dr["f_name"]);
m.Datetime = Convert.ToDateTime(_dr["f_datetime"]);
if(_dr["f_email"] != null)
{
m.Email = Convert.ToString(_dr["f_email"]);
}
if(_dr["f_url"] != null)
{
m.Url = Convert.ToString(_dr["f_url"]);
}
m.Mess = MarkupParser.Parse(Convert.ToString(_dr["f_message"]), true);
if(_dr["f_comment"] != null)
{
m.Comment = Convert.ToString(_dr["f_comment"]);
}
_arrList.Add(m);
}
return _arrList;
}
[/red]
Jag vet att det är mycket kod på en gång men om nån kan hjälpa mig så vore det tacksamt.
Mvh icaaq
Det jag undrar är hur jag skriver följande i C#:
[red]
_name.Text = CType(e.Item.DataItem, Message).Name
[/red]