InvalidOperationException was unhandled by user code

Status
Niet open voor verdere reacties.

HelpElec

Gebruiker
Lid geworden
6 mrt 2013
Berichten
102
Beste allemaal,

Ik krijg op de volgende code een InvalidOperationException. Ik wil een tabblad dynamisch aan een TabControl TabPages toevoegen.
Waardoor krijg ik de exception en hoe kan ik dit oplossen?

Code:
  public void Handler(ref TabControl TbContr, UInt32 Dev)
        {
            switch (Dev)
            {
                case (UInt32)Type.C12:
                    C12tabPage(ref TbContr);
                    break;
                case (UInt32)Type.C13:
                    C13tabPage(ref TbContr);
                    break;
                case (UInt32)Type.C14:
                    C14tabPage(ref TbContr);
                    break;
            }
        }

In de functie C12tabPage vindt de exception plaats op de derde regel als ik de TabPage wil toevoegen aan de TabControl:

Code:
        private void C12tabPage (ref TabControl TabContr)
        {
            TabPage TbPg = new TabPage();
            TbPgECR.Text = "C12";
            TabContr.TabPages.Add(TbPg);
        }

Alvast bedankt voor de hulp!

Groeten,
Geert
 
Laatst bewerkt:
Wellicht voor de duidelijkheid, ik gebruik een enum genaamd Type.
 
Ik heb hier geen ervaring mee maar ik heb wel wat googlekennis :o

Kan het zijn dat je deze code niet in de UI-thread uitvoert maar in een background thread? Aanpassingen in de GUI dien je namelijk in de UI-thread te doen.

Hope this helps,
Erik
 
Hallo Venerik,

Ik moet eerlijk bekennen dat ik dat niet precies weet...
Ik voer de code uit in een andere klasse dan waar de TabControl in staat. Dit is in Form1.cs. Heeft dit misschien te maken met de verschillende threads?
De TabControl wordt eerst meegegeven aan public void Handler(ref TabControl TbContr, UInt32 Dev) en daarna aan private void C12tabPage (ref TabControl TabContr).

Groeten
 
Ik lees op msdn: "The exception that is thrown when a method call is invalid for the object's current state".

Het lijkt (denk ik) te liggen aan het doorgeven van Reference parameters. Nu heb ik m'n code aangepast en ziet het er zo uit, maar ik hou de InvalidOperationException.


Code:
 switch (Dev)
            {
                case (UInt32)Type.C12:
                    TbContr.TabPages.Add(C12tabPage());
                    break;
                case (UInt32)Type.C13:
                    TbContr.TabPages.Add(C13tabPage());
                    break;
                case (UInt32)Type.C14:
                    TbContr.TabPages.Add(C14tabPage());
                    break;
            }

en

Code:
private TabPage C12tabPage ()
        {
            TabPage TbPg = new TabPage();
            TbPg.Text = "C12";
            return TbPg;
        }

De exception treedt weer op bij de "TbContr.TabPages.Add".
 
Ik heb de functie met de switch in de Form1 class gezet en de 'TabPage-functies' ook. De TabControl is nu dan ook geen parameter meer. Toch hou ik zelfs nu het probleem... Is het sowieso wel mogelijk om dynamisch een tabpage aan een tabcontrol toe te voegen?
 
Ik heb je code in een simpel formpje gegooid en het werkt als een tierelier.

Code:
    enum Type
    {
        C12, C13, C14
    }

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Handler(ref tabControl1, 0);
        }

        public void Handler(ref TabControl TbContr, UInt32 Dev)
        {
            switch (Dev)
            {
                case (UInt32)Type.C12:
                    C12tabPage(ref TbContr);
                    break;
                case (UInt32)Type.C13:
                    //C13tabPage(ref TbContr);
                    break;
                case (UInt32)Type.C14:
                    //C14tabPage(ref TbContr);
                    break;
            }
        }

        private void C12tabPage(ref TabControl TabContr)
        {
            TabPage TbPg = new TabPage();
            TbPg.Text = "C12";
            TabContr.TabPages.Add(TbPg);
        }
    }

Dynamisch toevoegen van pages is dus mogelijk. Blijft de vraag: waarom krijg jij een exception...

Ik denk niet dat het met mijn eerdere GUI-thread opmerking te maken heeft. Jij doet alles vanuit je form en daarmee alles vanuit de GUI-thread. Dat kan het dus niet zijn, lijkt mij.

Heb je je Tabcontrol ook dynamisch gemaakt of gewoon in de Designer? Als je die ook dynamisch hebt gemaakt zou dat misschien de 'invalid current state' kunnen verklaren.

Succes,
Erik
 
Hallo Erik,

Ik ben er weer even mee bezig geweest en in een nieuw project, of met een ander event in hetzelfde project, werkt hij inderdaad ook bij mij. Ik heb het als functies in verschillende classes geprobeerd en ook in één class: geen verschil.
Het zou dus enkel kunnen liggen aan de 'manier' waarop ik hem aanroep? Denk ik.
Ik gebruik een Button-event waarmee ik een eerste functie oproep die de lijst 'Dev' genereert en daarna de eerder beschreven functies uitvoert, zoals hier te zien is. Ook deze functie gebruikt weer een enum. Alle 'states' worden chronologisch doorlopen, per state wordt de list verder aangevuld.

Code:
 private void GetDev(UInt32 State)
        {
            switch (State)
            {
                case (UInt32)GetDev.CMD_SERIE:
                    Com.ReadMessage(GetSerie, 0)
                    break;
                case (UInt32)GetDev.CMD_PROD:
                    for (int i = 0; i < ListDev.Count; i++)
                    {
                        Com.ReadMessage(GetProd, Serie[i]);
                    }
                    break;
                case (UInt32)GetDev.CMD_DEV:
                    for (int i = 0; i < ListDev.Count; i++)
                    {
                        Com.ReadMessage(GetDev, Serie[i]);
                    }
                    break;
                    case(UInt32)GetDev.IDLE:
                    for (int i = 0; i < ListDev.Count; i++)
                    {
                        Handler(ListDev[i]);
                    }
                    break;
            }
        }

En die Handler is dus weer:

Code:
switch (Dev)
            {
                case (UInt32)Type.C12:
                    TbContr.TabPages.Add(C12tabPage());
                    break;
                case (UInt32)Type.C13:
                    TbContr.TabPages.Add(C13tabPage());
                    break;
                case (UInt32)Type.C14:
                    TbContr.TabPages.Add(C14tabPage());
                    break;
            }

Gebruik ik deze structuur krijg ik de exception, zelfs als ik in GetDev.IDLE de list eerst nog volledig overschrijf met een voorgedefinieerde list.
 
Niemand een idee?

Zou het wellicht met het type Timer te maken kunnen hebben? Of je een Threading of een System Timer gebruikt?
 
Okay, ik zal hier even goed naar kijken. Nou, in m'n eerste stuk kwam ook (niet direct) een timer voor. Ik gebruikte toen een timer als een tijdslimiet voor het lezen van de communicatie, "Com.ReadMessage()" zoals in mijn voorlaatste reactie staat (Had ik moeten vermelden). Maar ik krijg in een nieuw stuk code weer deze exception en dit keer lijkt het erg op het probleem uit jouw link. Ik loop een timer om te kijken of er updates plaats vinden en zo ja, dan hebben die updates invloed op Textboxen en andere controls. Is er dan een update, en wilt hij deze weergeven in een textbox, geeft hij de exception.

Ik zal even de link goed doorlezen. Ik gebruik overigens System.Timers.Timer.
 
Het lag inderdaad aan het type timer. Fijn om te weten. Ander type gebruikt en het werkt perfect.

Bedankt voor de hulp!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan