Avatar billede c-sharp Nybegynder
19. maj 2005 - 08:14 Der er 7 kommentarer og
2 løsninger

hjælp til linkbutton i nested repeater

Jeg bruger nested repeater på en side, og i den inerste repeater har jeg en knap der gerne skulle udløse en event, jeg har derfor prøvet følgende:

I min aspx:
<asp:Repeater .....>

                <asp:Repeater ID="overskriftRepeater" runat="server">
                                            <ItemTemplate>           
                                                <td class="listetop"><strong><asp:LinkButton id="sorter" Text='<%# DataBinder.Eval(Container.DataItem, "navn") %>' CommandName='<%# DataBinder.Eval(Container.DataItem, "specId")%>' Runat="Server"/></strong></td>
                                            </ItemTemplate>           
                                        </asp:Repeater>
</asp:repeater>

I min CS fil:
                // Er OnItemDataBoud for den yderste repeater
        private void overRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                                        //Prøver at tilføje event til linkbutton i den inerste repeater
                    ((Repeater) e.Item.FindControl("overskriftRepeater")).ItemCommand += new RepeaterCommandEventHandler(overskriftRepeater_ItemCommand);
}
}

Jeg håber det er til at overskue
Avatar billede snepnet Nybegynder
19. maj 2005 - 17:47 #1
hej c# :o)

du hooker eventet op i et andet event... det går ikke så godt.
angiv den deklaretivt istedet (det er nok det nemmeste) :

<asp:LinkButton id="innerLinkButton" runat="server" OnClick="innerLinkButton_Click"></asp:LinkButton>

og så ellers på vanlig vis :

protected void innerLinkButton_Click(object sender, EventArgs e)
{
  // og så da du ved det er en linkbutton
  LinkButton lbtn = (LinkButton)sender;
  // så har du nallerne i den ;o)
}

tilføj eventuelt :
<asp:LinkButton id="innerLinkButton" runat="server" OnClick="innerLinkButton_Click" CommandName="someCommand" CommandArgument="someArgument"></asp:LinkButton>

... dem kan du så kigge på i metoden :
switch(lbtn.CommandName)
{
  // ...
}

eller måske
DoSomethingOnArgument(lbtn.CommandArgument);

mvh
Avatar billede c-sharp Nybegynder
20. maj 2005 - 08:53 #2
Så takker jeg endnu engang mange gange for de vise ord :~}

Du skriver at det ikke er godt at "hooke en event op i en anden event", jeg har følgende kode hvor jeg sætter en "ItemDataBound" på den innerste repeater i en nested repeater:

private void overRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==     ListItemType.AlternatingItem)
    {
        if(!erKaldt)
        {
            ((Repeater)                 e.Item.FindControl("produktRepeater")).ItemDataBound += new         RepeaterItemEventHandler(produktRepeater_OnItemDataBound);
    erKaldt = true;
        }
    }
}

Det virker fint, men er der en pænere måde at gøre det på?

Smid i øvrigt et svar så er der point på vej til dig...
Avatar billede burningice Nybegynder
21. maj 2005 - 10:28 #3
ja... jeg ville nok have en placeholder stående på den plads hvor din linkbutton er nu. På den måde kan du tilføje en label hvis at >erKaldt< er true, og en linkbutton hvis ikke.

Problemet med det nu, er, at selvom der ikke er knyttet en eventhandler til din linkButton, så kan man stadigvæk trykke på den. Det er dårlig stil at have et link, som ikke har nogen effekt.
Avatar billede burningice Nybegynder
21. maj 2005 - 10:31 #4
hmm... jeg sidder da vist og ævler, gør jeg ikke... ? Blander vist 20/05-2005 08:53:35 og 19/05-2005 17:47:31 sammen :S :S

Hmm.. sorry...

Men nej. Til dit RIGTIGE spørgsmål, så er det den bedste måde at gøre det på, da du jo kun i dit ItemDataBound-event kan vide om din nested repeater skal have en eventhandler eller ej.
Avatar billede c-sharp Nybegynder
21. maj 2005 - 11:54 #5
Så takker jeg mange gange for hjælpen! snepnet og cyberfessor smid et svar så er der point på vej. Jeg forhøjer med 15 point så cyberfessor får 15 point og snepnet får 30 point.
Avatar billede burningice Nybegynder
21. maj 2005 - 11:56 #6
.
Avatar billede snepnet Nybegynder
21. maj 2005 - 12:51 #7
i kan lege lidt med det her hvis i har lyst :

<%@ Page language="c#" Codebehind="NestedeRepeatere.aspx.cs" AutoEventWireup="false" Inherits="WebAppsWeb.NestedeRepeatere" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>NestedeRepeatere</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
            <P>
                a<asp:Repeater id="OuterRepeater" runat="server">
                    <ItemTemplate>
                        <asp:Label ID="outerLabel" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "FldString") %>'>
                        </asp:Label>
                        <br>
                        <asp:Repeater ID="InnerRepeater" Runat="server">
                            <ItemTemplate>
                                <asp:Button ID="innerButton" Runat="server" Text="innerButton"></asp:Button><br>
                                <asp:Button ID="otherButton" Runat="server" Text="otherButton" OnClick="otherButton_Click"></asp:Button>
                            </ItemTemplate>
                        </asp:Repeater>
                        <br>
                    </ItemTemplate>
                </asp:Repeater></P>
            <P>
                <asp:Button id="btnJustForPostback" runat="server" Text="Button"></asp:Button></P>
        </form>
    </body>
</HTML>


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 DataAccess;

namespace WebAppsWeb
{
    public class NestedeRepeatere : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Button btnJustForPostback;
        protected System.Web.UI.WebControls.Repeater OuterRepeater;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                Bind();
            }
        }

        private void Bind()
        {
   
            DataSet ds = new ExpDataAccess().GetSampleData(2);
            OuterRepeater.DataSource = ds;
            OuterRepeater.DataBind();               
        }

        private DataSet GetInnerData()
        {
            return new ExpDataAccess().GetSampleData(1);
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.OuterRepeater.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.OuterRepeater_ItemDataBound);
            this.btnJustForPostback.Click += new System.EventHandler(this.btnJustForPostback_Click);
            this.Load += new System.EventHandler(this.Page_Load);

        }

        private void OuterRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater innerRepeater = (Repeater)e.Item.FindControl("innerRepeater");
                innerRepeater.DataSource = GetInnerData();
                innerRepeater.ItemDataBound += new RepeaterItemEventHandler(CBinnerRepeater_ItemDataBound);
                innerRepeater.DataBind();
            }
        }

        private void CBinnerRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {           
            Button btn = (Button)e.Item.FindControl("innerButton");
            btn.Click += new EventHandler(CBbtn_Click);
        }

        private void CBbtn_Click(object sender, EventArgs e)
        {
            Response.Write("INNER_CLICK_DATABOUND<br>");
        }

        protected void otherButton_Click(object sender, EventArgs e)
        {
            Response.Write("OTHER_CLICK<br>");
        }

        private void btnJustForPostback_Click(object sender, System.EventArgs e)
        {
            Response.Write("POSTBACK<br>");
        }

        private void btn2_Click(object sender, EventArgs e)
        {
            Response.Write("INNER_CLICK<br>");
        }
    }
}

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 DataAccess;

namespace WebAppsWeb
{
    public class NestedeRepeatere : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Button btnJustForPostback;
        protected System.Web.UI.WebControls.Repeater OuterRepeater;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                Bind();
            }
        }

        private void Bind()
        {   
            DataSet ds = new ExpDataAccess().GetSampleData(2);
            OuterRepeater.DataSource = ds;
            OuterRepeater.DataBind();               
        }

        private DataSet GetInnerData()
        {
            return new ExpDataAccess().GetSampleData(1);
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.OuterRepeater.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.OuterRepeater_ItemDataBound);
            this.btnJustForPostback.Click += new System.EventHandler(this.btnJustForPostback_Click);
            this.Load += new System.EventHandler(this.Page_Load);

        }

        private void OuterRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater innerRepeater = (Repeater)e.Item.FindControl("innerRepeater");
                innerRepeater.DataSource = GetInnerData();
                innerRepeater.ItemDataBound += new RepeaterItemEventHandler(CBinnerRepeater_ItemDataBound);
                innerRepeater.DataBind();
            }
        }

        private void CBinnerRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {           
            Button btn = (Button)e.Item.FindControl("innerButton");
            btn.Click += new EventHandler(CBbtn_Click);
        }

        private void CBbtn_Click(object sender, EventArgs e)
        {
            Response.Write("INNER_CLICK_DATABOUND<br>");
        }

        protected void otherButton_Click(object sender, EventArgs e)
        {
            Response.Write("OTHER_CLICK<br>");
        }

        private void btnJustForPostback_Click(object sender, System.EventArgs e)
        {
            Response.Write("POSTBACK<br>");
        }

        private void btn2_Click(object sender, EventArgs e)
        {
            Response.Write("INNER_CLICK<br>");
        }
    }
}

hvis i vil have en implementering af GetSampleData(x) siger i bare til.
mvh
Avatar billede c-sharp Nybegynder
22. maj 2005 - 12:31 #8
Super med et eksempel, er det mig der ser dobbelt i den sidste halvdel af koden :-)

I får mange tak for hjælpen!
Avatar billede snepnet Nybegynder
22. maj 2005 - 12:34 #9
*G* CTRL+V er jo så nemt at trykke :o)
vi skrives ved ;o)
mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester