webForumDet fria alternativet

DataBinder.Eval(Container.DataItem, "Name") %>

13 svar · 658 visningar · startad av icaaq

icaaqMedlem sedan okt. 20005 273 inlägg
#1

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å???

PatrikBMedlem sedan mars 20002 836 inlägg
#2

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

icaaqMedlem sedan okt. 20005 273 inlägg
#3

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

PatrikBMedlem sedan mars 20002 836 inlägg
#4

Har du den ligger i en datagrid, datalist, repeater?

mer kod så ska jag hjälpa till .....

PatrikBMedlem sedan mars 20002 836 inlägg
#5

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

renholmMedlem sedan apr. 20012 266 inlägg
#6

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>
icaaqMedlem sedan okt. 20005 273 inlägg
#7

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

PatrikBMedlem sedan mars 20002 836 inlägg
#8

Vad är det som inte funkar med din kod?
Vad är det du vill åstadkomma?

cya,
PatrikB

renholmMedlem sedan apr. 20012 266 inlägg
#9

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}") %>'

icaaqMedlem sedan okt. 20005 273 inlägg
#10

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å.

PatrikBMedlem sedan mars 20002 836 inlägg
#11

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

icaaqMedlem sedan okt. 20005 273 inlägg
#12

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>
		&nbsp;
	</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

icaaqMedlem sedan okt. 20005 273 inlägg
#13

Det jag undrar är hur jag skriver följande i C#:

[red]
 _name.Text = CType(e.Item.DataItem, Message).Name
[/red]
icaaqMedlem sedan okt. 20005 273 inlägg
#14

Det var denna jag letade efter

[red]
((Message)e.Item.DataItem).Name;[/red]

Mvh icaaq

143 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)