Avatar billede c-sharp Nybegynder
08. marts 2006 - 15:31 Der er 16 kommentarer

Problem med knap i nested repeater

Jeg har en nested repeater hvor jeg i den innerste repeater tilføjer en knap fra min codebehind, den knap har jeg nogle problemer med at få til at fungere, jeg har følgende kode:

//Den yderste repeater
protected void gruppeRepeater_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {

            ((Repeater) e.Item.FindControl("produktRepeater")).ItemDataBound += new RepeaterItemEventHandler(produktRepeater_ItemDataBound);
            ((Repeater) e.Item.FindControl("produktRepeater")).DataSource = al;
            ((Repeater) e.Item.FindControl("produktRepeater")).DataBind();

        }
}

//Den innerste repeater
protected void produktRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {

    Button bestil = new Button();
    bestil.Text = "Køb";
    bestil.CommandArgument = "test";
    bestil.CommandName = "name";
    bestil.Click += new EventHandler(this.bestil_Click);
    ((System.Web.UI.WebControls.PlaceHolder)e.Item.FindControl("vaerdieholder")).Controls.Add(bestil);

    }
}

  protected void bestil_Click(object sender, System.EventArgs e)
    {
        Response.Write("Der er bestilt");
        lavFelter();
    }

    protected void repeater_click(object sender, System.EventArgs e)
    {
        Response.Write("Der er bestilt");
        lavFelter();
    }



og i min aspx fil:

<asp:Repeater ID="gruppeRepeater" OnItemDataBound="gruppeRepeater_OnItemDataBound" Runat="Server">
                            <ItemTemplate>
      ...................

                                            <asp:Repeater ID="produktRepeater" OnItemCommand="repeater_click" runat="server">                    <ItemTemplate>           
              ...............................

OSV.
Avatar billede snepnet Nybegynder
08. marts 2006 - 15:48 #1
bestil_Click bliver kun tilknyttet når du databinder - men repeater_Click burde køre.... gør den ikke det?
mvh
Avatar billede c-sharp Nybegynder
08. marts 2006 - 15:52 #2
Siden reloades men den kommer ikke ind i hverken bestil_Click eller repeater_click
Avatar billede snepnet Nybegynder
08. marts 2006 - 17:00 #3
kan du ikke sætte knappen ind i templaten til din repeater? - hvad er det her "vaerdieholder" for øvrigt?
mvh
Avatar billede c-sharp Nybegynder
08. marts 2006 - 17:44 #4
Vaerdieholder er en placeholder hvor jeg smider min knap i, den indholder forskellge ting for hver post i databasen...
Avatar billede snepnet Nybegynder
08. marts 2006 - 20:14 #5
prøv at læg den kode du har ind i en handler af ItemCreated istedet.
mvh
Avatar billede c-sharp Nybegynder
09. marts 2006 - 07:46 #6
Kan du forklare det lidt nærmere?
Avatar billede c-sharp Nybegynder
09. marts 2006 - 20:10 #7
snepnet husk lige den her ;-)
Avatar billede snepnet Nybegynder
09. marts 2006 - 20:39 #8
uj - sorry.

- det er lidt det samme som i det andet spørgsmål.
hvis du har dit ItemTemplate - kan du sætte en knap derind - sådan på denne form:

<asp:Repeater ID="outerRepeater" runat="server">
    <ItemTemplate>
        <asp:Repeater ID="innerRepeater" runat="server">
            <ItemTemplate>
                <asp:Button ID="btnHitIt" runat="server" OnClick="..." />
            </ItemTemplate>
        </asp:Repeater>
    </ItemTemplate>
</asp:Repeater>


mvh
Avatar billede c-sharp Nybegynder
09. marts 2006 - 21:24 #9
Jeg bruger en placeholder fordi at alle komponenterne der bliver tilføjet er dynamiske. Det vil sige at på den ene linie kan det være en tekstbox, den næste linie en kan osv.
Avatar billede c-sharp Nybegynder
09. marts 2006 - 21:25 #10
Lige en rettelse kan = knap :-)

altså: den næste linie en knap osv.
Avatar billede snepnet Nybegynder
09. marts 2006 - 23:13 #11
hov - det var da egentlig noget forkert jeg svarede dig på her til sidst.
ItemCreated bliver fyret hver gang et item bliver skabt (ligger jo nærmest i navnet på eventet).

du kan prøve et eksempel som det her - så kan du få det til at virke uden at databinde hver gang:

// aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="StdRepeater.aspx.cs" Inherits="RepeaterTrix_StdRepeater" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Repeater ID="outerRepeater" runat="server" OnItemDataBound="outerRepeater_ItemDataBound" OnItemCreated="outerRepeater_ItemCreated">
            <ItemTemplate>
                <asp:Repeater ID="innerRepeater" runat="server">
                    <ItemTemplate>
                        <asp:PlaceHolder ID="phActions" runat="server" /><br />
                    </ItemTemplate>
                </asp:Repeater>
                <br />
            </ItemTemplate>           
        </asp:Repeater>
        <br />
        <asp:Button ID="btnPostBack" runat="server" />
    </div>
    </form>
</body>
</html>


// og koden
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class RepeaterTrix_StdRepeater : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string[] outerResource = { ".", ".", "." };
            outerRepeater.DataSource = outerResource;
            outerRepeater.DataBind();
        }
    }
   
    protected void outerRepeater_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        Repeater innerRepeater = e.Item.FindControl("innerRepeater") as Repeater;
        innerRepeater.ItemCreated += new RepeaterItemEventHandler(innerRepeater_ItemCreated);
    }

    void innerRepeater_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        PlaceHolder ph = e.Item.FindControl("phActions") as PlaceHolder;
        Button btn = new Button();
        btn.Text = "klik her";       
        btn.Click += new EventHandler(btn_Click);
        ph.Controls.Add(btn);
    }

    void btn_Click(object sender, EventArgs e)
    {
        Response.Write("Clicked");
    }
   
    protected void outerRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        Repeater innerRepeater = e.Item.FindControl("innerRepeater") as Repeater;
        string[] innerResource = { ".", ".", "." };
        innerRepeater.DataSource = innerResource;
        innerRepeater.DataBind();
    }
}

mvh
Avatar billede snepnet Nybegynder
09. marts 2006 - 23:14 #12
og et eksempel på det det andet jeg snakkede om:

// aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="StdRepeater2.aspx.cs" Inherits="RepeaterTrix_StdRepeater2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Repeater ID="outerRepeater" runat="server" OnItemDataBound="outerRepeater_ItemDataBound" >
            <ItemTemplate>
                <asp:Repeater ID="innerRepeater" runat="server" OnItemCommand="innerRepeater_ItemCommand">
                    <ItemTemplate>
                        <asp:PlaceHolder ID="phActions" runat="server"><asp:Button ID="btnButton" Text="klik her" runat="server" /></asp:PlaceHolder><br />
                    </ItemTemplate>
                </asp:Repeater>
                <br />
            </ItemTemplate>           
        </asp:Repeater>
        <br />
        <asp:Button ID="btnPostBack" runat="server" />   
    </div>
    </form>
</body>
</html>

// og kode
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class RepeaterTrix_StdRepeater2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string[] outerResource = { ".", ".", "." };
            outerRepeater.DataSource = outerResource;
            outerRepeater.DataBind();
        }
    }
   
    protected void outerRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        Repeater innerRepeater = e.Item.FindControl("innerRepeater") as Repeater;
        string[] innerResource = { ".", ".", "." };
        innerRepeater.DataSource = innerResource;
        innerRepeater.DataBind();
    }

    protected void innerRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        Response.Write("COMMAND");
    }
}

mvh
Avatar billede c-sharp Nybegynder
10. marts 2006 - 13:14 #13
Hej Snepnet

Jeg kan godt se at dine forslag virker fint, men når tilretter min løsning efter den første fremgangsmåde du har posted, får jeg et problem med at bruger ItemCreated.

I min løsning henter jeg oplysninger om de felter der skal være på siden i databasen, jeg opretter så felterne og ligger dem i en ArrayListe som min repeatere så skal gennemløbe, den innerste repeater skal så placer disse felter i placholderen.

Problemet er at når jeg submitter kommer jeg i ItemCreated som det første og ikke i "btn_Click" som ellers skulle have lavet disse data :-(
Avatar billede snepnet Nybegynder
10. marts 2006 - 16:32 #14
du skal bare udføre en databinding i click-eventhandleren... så bliver dine ændringer reflekteret.
mvh
Avatar billede c-sharp Nybegynder
22. marts 2006 - 09:02 #15
Det har driller stadig men jeg har ikke lige tid til at rode med det fortiden så jeg vender tilbage senere
Avatar billede snepnet Nybegynder
22. marts 2006 - 20:06 #16
læg den kode du har ud når det passer - så tager jeg en kigger.
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