webForumDet fria alternativet

Problem med att trigga event

6 svar · 413 visningar · startad av nachip

nachipMedlem sedan aug. 200150 inlägg
#1

Hej!

Har problem att trigga OnSelectedIndexChanged i en DropDownList i en repeater. Får inga fel utan allt som sker är en postback utan att något händer.


<asp:Repeater ID="rptCart" runat="server" OnItemCommand="rptCart_ItemCommand" OnItemDataBound="rptCart_ItemDataBound">

        <ItemTemplate>
          
        
	            <%# Eval("ProductName") %>
        
        
                    <%# Eval("ManufacturerName") %>

                    <asp:Repeater ID="rptAttributes" runat="server">
                    
                        <ItemTemplate>
                        
                            <%# Eval("AttributeValue") %>
                        
                        </ItemTemplate>
                        
                        <SeparatorTemplate>
                            
                            /
                            
                        </SeparatorTemplate>
                    
                    </asp:Repeater>
        

                    [B]<asp:DropDownList ID="ddlQty" runat="server" OnSelectedIndexChanged="ddlQty_SelectedIndexChanged" EnableViewState="true" AutoPostBack="true" />[/B]  
        
                
                    <%# Eval("ProductPrice", "{0:c}") %>
                
                
                    <%# Eval("Subtotal", "{0:c}")%>
                

                
                    <asp:Literal ID="ltrId" runat="server" Text='<%# Eval("ProductID") %>' Visible="false" />
                    <asp:Button ID="btnRemove" Text="Ta bort" runat="server" />
  
            
        </ItemTemplate>

</asp:Repeater>
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 ShoppingCart : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
       if (!Page.IsPostBack)
       {
            PopulateControls();
       }
    }

    private void PopulateControls()
    {
        DataTable dt = ShoppingCartAccess.GetItems();

        if (dt.Rows.Count == 0)
        {
            lblStatus.Text = "Kundvagnen är tom.";

            rptCart.Visible = false;

        }
        else
        {
            rptCart.DataSource = dt;
            rptCart.DataBind();
        }
    }

    protected void rptCart_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        string productId = ((Literal)e.Item.FindControl("ltrId")).Text.ToString();

        bool success = ShoppingCartAccess.RemoveItem(productId);

        PopulateControls();
    }

    protected void rptCart_ItemDataBound(object source, RepeaterItemEventArgs e)
    {

        if (!Page.IsPostBack)
        {

            //------------------------------------------------------------------------------------------------
            //Populate repeater with attributes

            if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem)
            {
                return;
            }

            Repeater rptAttributes = (Repeater)e.Item.FindControl("rptAttributes");

            Literal ltrId = (Literal)e.Item.FindControl("ltrId");

            string productId = ltrId.Text;
            
            rptAttributes.DataSource = ShoppingCartAccess.GetProductAttributes(productId);
            rptAttributes.DataBind();
 
            //------------------------------------------------------------------------------------------------
            //Populate ddl with stock quantity

            int stockQty = Int32.Parse(DataBinder.Eval(e.Item.DataItem, "ProductStock").ToString());
            int cartQty = Int32.Parse(DataBinder.Eval(e.Item.DataItem, "Quantity").ToString());

            DropDownList ddl = (DropDownList)e.Item.FindControl("ddlQty");

            for (int i = 0; i < stockQty; i++)
            {

                ddl.Items.Insert(i, (i + 1).ToString());
                ddl.Items[i].Value = productId;

                if (i == cartQty)
                {
                    ddl.SelectedIndex = i - 1;
                }
            }

            //------------------------------------------------------------------------------------------------
        }
    }

    [B]public void ddlQty_SelectedIndexChanged(object sender, EventArgs e)
    {
        Response.Redirect("default.aspx");

        /*
        int qty = Int32.Parse(((DropDownList)sender).SelectedItem.Text.ToString());
        string productId = ((DropDownList)sender).SelectedItem.Value.ToString();
        
        bool success = ShoppingCartAccess.UpdateItem(productId, qty);
        */
    }[/B]
}

Någon som vet vad jag gör för fel?

CatZMedlem sedan jan. 20022 440 inlägg
#2

skulle tro att det inte är ditt fel utan visual studios. Testa stäng allting och öppna upp igen... ?

GladhMedlem sedan maj 20012 812 inlägg
#3

Jag har för mig följande, det kan vara ändrat till .net 2.0 (tyckte det någon gång)...

Det är att om du skapar kontroller dynamiskt, så som du gör i din repeater så kommer den kontrollen inte att finnas kvar vid din postback, detta eftersom när du gör en postback så laddar du om sidan och då finns ju inte din kontroll eftersom det är något som du skapar i din kod...

Eftersom kontrollen inte finns så kan .NET inte koppla ihop ditt event med rätt method. Jag tro det löser sig om du sätter viewstate=true på din repeater, eftersom denna då kommer återskapa alla kontroller i den (se dock upp med hur mycket data som faktiskt ligger i din viewstate). Om inte så måste du återskapa dina kontroller själv, det enklaste sättet är ju att bara köra din PopulateMethod en gång till så är det löst, men inte riktigt vad du vill kanske. Så fall får du skapa kontrollerna själv i Page.Init().

Gå ut och sök på google om dynamisk skapade kontroller och postback så hittar du massor med info..

- M

nachipMedlem sedan aug. 200150 inlägg
#4

Gladh skrev:

Jag har för mig följande, det kan vara ändrat till .net 2.0 (tyckte det någon gång)...

Det är att om du skapar kontroller dynamiskt, så som du gör i din repeater så kommer den kontrollen inte att finnas kvar vid din postback, detta eftersom när du gör en postback så laddar du om sidan och då finns ju inte din kontroll eftersom det är något som du skapar i din kod...

Eftersom kontrollen inte finns så kan .NET inte koppla ihop ditt event med rätt method. Jag tro det löser sig om du sätter viewstate=true på din repeater, eftersom denna då kommer återskapa alla kontroller i den (se dock upp med hur mycket data som faktiskt ligger i din viewstate). Om inte så måste du återskapa dina kontroller själv, det enklaste sättet är ju att bara köra din PopulateMethod en gång till så är det löst, men inte riktigt vad du vill kanske. Så fall får du skapa kontrollerna själv i Page.Init().

Gå ut och sök på google om dynamisk skapade kontroller och postback så hittar du massor med info..

- M

Tack för era svar.

Det är precis så som du säger. Jag har testat med att sätta viewstate till enabled på repeater utan resultat.
Eftersom jag fyller dropdownlistan med data från repeatern i dess ondatabound så återskapas det heller inte vid postback.

Jag kan ju förklara lite om vad jag vill åstadkomma. Som ni säkert redan listat ut så är det en kundvagn. I kundvagnens repeater så finns en dropdownlista för antal som fylls från 1 till produktens lagersaldo. När man ändrar antal så vill jag självklart att detta ska uppdateras genom att trigga det event som inte vill trigga... Frågan är hur jag ska göra för att lyckas med detta?

GladhMedlem sedan maj 20012 812 inlägg
#5

Frågan är hur jag ska göra för att lyckas med detta?

Det enklast är bara att du återskapar hela din kundvagn vid en postback, då kommer problemet att försvinna, annars måste du själv återskapa kontrollerna senast i Page.Init()

- M

CatZMedlem sedan jan. 20022 440 inlägg
#6

Kan ni nämna några fördelar med dynamiskt skapade kontroller?

nachipMedlem sedan aug. 200150 inlägg
#7

CatZ skrev:

Kan ni nämna några fördelar med dynamiskt skapade kontroller?

Finns det något alternativ så får du gärna berätta. :)

Har försökt återskapa hela kundvagnen nu med lik förbannat så fungerar det inte. Blir tokig på det här... :(

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