Avatar billede dk_akj Nybegynder
31. oktober 2014 - 18:45 Der er 6 kommentarer og
1 løsning

Loop gennem controls - finder ikke object

Hejsa,

Jeg har rodet mig ud i et mindre asp.net projekt, mit første.

Jeg har lavet en usercontrol som jeg opretter dynamisk på baggrund af data fra en db.

      foreach( DataRow dr in dt.Rows)
       
            {
                i++;
                ShopItem si = (ShopItem)LoadControl("ShopItem.ascx");
                PlaceHolder1.Controls.Add(si);

                si.Setitem(dr[1].ToString(), Convert.ToDecimal(dr[2].ToString()));

                si.onChange += new EventHandler(MyControl_onChange);
                PlaceHolder1.Controls.Add(new LiteralControl("<br />"));
            }


Min usercontrol trigger et event på ændringer, event subscriber ? jeg på når jeg opretter de enkelte instancer af min usercontrol.
Event trigges fint som det skal.

Nu vil jeg fra mit event (MyControl_onChange) gerne loope gennem alle controls på min webform? og kalde en eller flere funktioner til noget summering + check.

Har prøvet dette, men den finder ikke nogen objecter af typen ShopItem ??
  foreach(Control ctrl in this.Controls)
    {
    if (ctrl.GetType().ToString() == "ShopItem") {

    }
}

Hvad er grunden til det ?

Mvh
Anders
Avatar billede keysersoze Guru
31. oktober 2014 - 21:18 #1
Det er vel dit ShopItem du lægger eventen på så this må være ShopItem?
Avatar billede dk_akj Nybegynder
31. oktober 2014 - 21:29 #2
Når event er defineret som dette er det vel på webformen ?

namespace WebApplication1
{
    public partial class Bestil : System.Web.UI.Page
    {
        private void MyControl_onChange(object sender, EventArgs e)
        {
            LabelTotal.Text = "test";
            foreach (Control ctrl in this.Controls)
            {
                if (ctrl.GetType().ToString() == "ShopItem")
                {

                }
            }

        }

Mvh
Anders
Avatar billede dk_akj Nybegynder
31. oktober 2014 - 21:39 #3
this.GetType().ToString(); returnerer "ASP.bestil_aspx" hvis det hjælper ?

Mvh
Anders
Avatar billede keysersoze Guru
31. oktober 2014 - 21:40 #4
Sry - det er selvfølgelig rigtigt, det er lidt tid siden jeg har leget med webforms. Men så er du nødt til at løbe recursivt igennem da du lige nu kun fanger første niveau af controls, fx din PlacerHolder1, men disse controls indeholder jo også nogle controls - alternativt, og nok bedre, så lav løkken på din PlaceHolder1, altså

foreach (var ctrl in PlaceHolder1.Controls)

Det letteste fremadrettet er hvis du sætter et breakpoint i din kode så du kan se hvad der sker og ikke sker.
Avatar billede dk_akj Nybegynder
31. oktober 2014 - 21:58 #5
Aha, så Placeholder1 er parent til mit object, tak, det virker nu
Bruger sørme debugger flittigt, men havde ikke luret denne.

Læg gerne et svar :-)

Mvh
Anders


Til andre der måtte have samme problem er koden her:

        private void MyControl_onChange(object sender, EventArgs e)
        {

            int qty = 0;
            foreach (Control ctrl in PlaceHolder1.Controls)
            {
                if (ctrl.GetType().ToString() == "ASP.shopitem_ascx")
                {
                    ShopItem s = (ShopItem)ctrl;
                    qty += s.GetQty();
                }
            }
            LabelTotal.Text = qty.ToString();
        }
Avatar billede keysersoze Guru
31. oktober 2014 - 22:04 #6
svar :)
Avatar billede dk_akj Nybegynder
31. oktober 2014 - 22:34 #7
Takker, god weekend :-)
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

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