Avatar billede keenkbh Nybegynder
26. oktober 2007 - 18:04 Der er 4 kommentarer og
2 løsninger

problemer med EasyMenu

Hej alle.

Jeg har et lille problem.

Jeg er igang med at opdatere en side fra ASP til ASP.NET, og i den forbindelse har jeg fundet Obout's EasyMenu, som skal implementeres.

Fair nok, det så jo rimelig nemt ud, og det var også forholdsvist nemt at få oprettet selve menuen, men når jeg skal lave undermenuerne går det galt.

Jeg får følgende fejl: The control collection cannot be modified during DataBind, Init, Load, PreRender or Unload phases.

Min kode ser sådan her ud:

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlClient;
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;

using MySql.Data.MySqlClient;
using System.Data.OleDb;
using OboutInc.EasyMenu_Pro;

public partial class golfon : System.Web.UI.MasterPage
{
    // Connectionstring til db. Skal ændres senere.
    public string sqlString = "server=db.golfon.dk;uid=web196132;pwd=w5nr949m92;database=web196132;";

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            venstreMenuObout();
        }
    }

    protected void venstreMenuObout()
    {
        // Lav MySQL-halløj her
        MySqlConnection conOver = new MySqlConnection(sqlString);
        MySqlDataAdapter overMenu = new MySqlDataAdapter("SELECT * FROM Kategori WHERE Subkategori=0 ORDER BY Navn ASC", conOver);
        DataSet overLevel = new DataSet();
        overMenu.Fill(overLevel);

        foreach (DataRow d in overLevel.Tables[0].Rows)
        {
            Table menuTabel = new Table();
            TableRow r = new TableRow();
            TableCell c1 = new TableCell();
            c1.CssClass = "";
            TableCell c2 = new TableCell();
            c2.Text = d["Navn"].ToString();
            c2.CssClass = "";
            c2.BackColor = System.Drawing.Color.Salmon;
            TableCell c3 = new TableCell();
            c3.CssClass = "";
            r.Controls.Add(c1);
            r.Controls.Add(c2);
            r.Controls.Add(c3);
            menuTabel.Rows.Add(r);

            TableRow rMenu = new TableRow();
            TableCell cMenu = new TableCell();
            cMenu.ColumnSpan = 3;
            rMenu.Controls.Add(cMenu);
            menuTabel.Rows.Add(rMenu);
            PlaceHolder p = new PlaceHolder();
           
            //Lav parent-menuen
            EasyMenu menu = new EasyMenu();
            menu.ID = d["Kategori"].ToString();
            menu.Width = "120";
            menu.Position = MenuPosition.Vertical;
            menu.ShowEvent = MenuShowEvent.Always;

            // css classes names for the menu and the item container
            menu.CSSMenu = "ParentMenu";
            menu.CSSMenuItemContainer = "ParentItemContainer";
           
            // css classes names for MenuItems
            CSSClasses MenuItemCssClasses = menu.CSSClassesCollection[menu.CSSClassesCollection.Add(new CSSClasses(typeof(OboutInc.EasyMenu_Pro.MenuItem)))];
            MenuItemCssClasses.ComponentSubMenuCellOver="ParentItemSubMenuCellOver";
            MenuItemCssClasses.ComponentContentCell="ParentItemContentCell";
            MenuItemCssClasses.Component="ParentItem";
            MenuItemCssClasses.ComponentSubMenuCell="ParentItemSubMenuCell";
            MenuItemCssClasses.ComponentIconCellOver="ParentItemIconCellOver";
            MenuItemCssClasses.ComponentIconCell="ParentItemIconCell";
            MenuItemCssClasses.ComponentOver="ParentItemOver";
            MenuItemCssClasses.ComponentContentCellOver="ParentItemContentCellOver";
            // add the classes names to the collection
            menu.CSSClassesCollection.Add(MenuItemCssClasses);

            //Tilføj menuen vha. Obout EasyMenu og MySQL
            MySqlConnection con = new MySqlConnection(sqlString);
            MySqlDataAdapter katMenu = new MySqlDataAdapter("SELECT * FROM Kategori WHERE Subkategori ="+ Convert.ToInt32(d["Kategori"].ToString()), con);
            DataSet over = new DataSet();
            katMenu.Fill(over);

            foreach(DataRow dr in over.Tables[0].Rows)
            {
                menu.AddItem(new OboutInc.EasyMenu_Pro.MenuItem(dr["Kategori"].ToString(),dr["Navn"].ToString(),"","","",""));

                // Her tilføjes producenter, som er i kategorien
                EasyMenu underMenu = new EasyMenu();
                underMenu.ID = "underMenu_" + dr["Kategori"].ToString();
                underMenu.ShowEvent = MenuShowEvent.MouseOver;
                underMenu.AttachTo = dr["Kategori"].ToString();
                underMenu.Width = "90";
                underMenu.Align = MenuAlign.Left;

                MySqlConnection conUnder = new MySqlConnection(sqlString);
                MySqlDataAdapter katMenuUnder = new MySqlDataAdapter("SELECT DISTINCT(b.Producent),p.Pnavn FROM Bolde b, Producent p WHERE b.Producent = p.ID AND b.Kategori=" + Convert.ToInt32(dr["Kategori"].ToString()), conUnder);
                DataSet under = new DataSet();
                katMenuUnder.Fill(under);

                foreach (DataRow dt in under.Tables[0].Rows)
                {
                    underMenu.AddItem(new OboutInc.EasyMenu_Pro.MenuItem(dt["Producent"].ToString(), dt["Pnavn"].ToString(), "", "priser.aspx?kat=" + dr["Kategori"].ToString() + "&prod=" + dt["Producent"].ToString()));
                }
                underMenu.AddItem(new OboutInc.EasyMenu_Pro.MenuItem("alle", "Vælg alle", "", "priser.aspx?kat=" + dr["Kategori"].ToString()));

                Page.Controls.Add(underMenu);
            }

            //Bind menuen til Placeholderen
            p.Controls.Add(menu);
            cMenu.Controls.Add(p);
            venstreDiv.Controls.Add(menuTabel);
        }
    }
}

Jeg håber der er en, som kan hjælpe, for jeg er kørt fast, og det skal jo virke...
Avatar billede neoman Novice
26. oktober 2007 - 18:42 #1
Jeg har aldrig prøvet at gøre det sådan som du gør, så jeg er ikke sikker på, at en DIV kan virke som en holder for dynamisk-tilføjede kontroller :
"In order to programmatically add a control to a page, there must be a container for the new control. For example, if you are creating table rows, the container is the table. If there is no obvious control to act as container, you can use a PlaceHolder or Panel Web server control." I så fald skal der være en eller flere PlaceHoldere defineret i ASPX markup'en, og så kan man fylde noget i dem.

På samme måde kan man lægge en tom <asp:table runat="server" id="myTable" og så tilføje rækker/celler dynamisk. Finally, jeg kunne forestille mig at "underMenu" ligeledes skal addes til en eller anden placeholder/table/panel (istedet for Page.Controls.Add) -for hvordan skulle systemet ellers vide hvor kontrollen skal placeres? Denne er måske den første jeg ville prøve at ændre.
Avatar billede keenkbh Nybegynder
26. oktober 2007 - 19:21 #2
man kan sagtens bruge et html-div server side, man skal bare tilføje et runat="server". Og jeg kan sagtens få "hovedmenuen" frem på siden, det er undermenuerne der er problemet.

Jeg tror det er noget med tidspunktet jeg binder undermenuerne på, men jeg er ikke sikker...

Vil også lige nævne, at jeg bruger masterpages, og det kan måske også være grunden, men ved det ikke.
Avatar billede neoman Novice
26. oktober 2007 - 19:44 #3
Ok - kan være  meddelelsen sigter på noget andet: At data bliver ændret mensdu laver alt dette her.

Hvad laver new MySqlConnection(sqlString); ? Hvis den også åbner en connection, så forbliver en connection åben efter at adapteren har haft fat i den, selv om jeg ikke helt kan se hvordan det skulle kunne spolere legen.
Avatar billede neoman Novice
26. oktober 2007 - 20:12 #4
det er nok denne her som smadrer det :          cMenu.Controls.Add(p);

cmenu er allerede tilføjet til en række i tabellen, så hvis du vil tilføje noget til den celle efterfølgende så skal du nok finde den igen inde i tabellen

myTable.Rows(rowIndex).Cells(cellIndex).Controls.Add(p):
Avatar billede keenkbh Nybegynder
26. oktober 2007 - 22:47 #5
jeg har selv fundet ud af det...

Det krævede bare, at jeg lavede hele koden om... :-|

Men smid et svar neoman, så deler vi...
Avatar billede neoman Novice
26. oktober 2007 - 22:54 #6
du kunne ha fundet dets rowindex efterfølgende    Table1.Rows.GetRowIndex(r)
men pyt:)
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