Avatar billede thomaxz Nybegynder
16. oktober 2006 - 08:59 Der er 6 kommentarer og
2 løsninger

Array af controller

jeg har via http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vcwlkArraysTutorial.asp

lave flg. kode

LabelArray.cs indholder :

/*
* Created by SharpDevelop.
* User: Thomas
* Date: 13-10-2006
* Time: 10:18
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/

using System;

namespace lotto
{
    /// <summary>
    /// Description of LabelArray.
    /// </summary>
    public class LabelArray : System.Collections.CollectionBase
    {
        private readonly System.Windows.Forms.Form HostForm;
       
        public System.Windows.Forms.Label AddNewLabel()
        {
             
            // Create a new instance of the Button class.
              System.Windows.Forms.Label aLabel = new System.Windows.Forms.Label();
              // Add the button to the collection's internal list.
              this.List.Add(aLabel);
              // Add the button to the controls collection of the form
              // referenced by the HostForm field.
              HostForm.Controls.Add(aLabel);
              // Set intial properties for the button object.
              aLabel.Top = Count * 25;
              aLabel.Left = 100;
              aLabel.Tag = this.Count;
              aLabel.Text = "Label " + this.Count.ToString();
              aLabel.Click += new System.EventHandler(ClickHandler);
              return aLabel;
        }
       
        public LabelArray(System.Windows.Forms.Form host)
        {
              HostForm = host;
              this.AddNewLabel();
        }
       
        public System.Windows.Forms.Label this [int Index]
        {
            get
              {
                  return (System.Windows.Forms.Label) this.List[Index];
              }
        }
       
        public void Remove()
        {
            // Check to be sure there is a button to remove.
              if (this.Count > 0)
              {
                  // Remove the last button added to the array from the host form
                  // controls collection. Note the use of the indexer in accessing
                  // the array.
                  HostForm.Controls.Remove(this[this.Count -1]);
                  this.List.RemoveAt(this.Count -1);
              }
        }
       
        public void ClickHandler(Object sender, System.EventArgs e)
        {
                  System.Windows.Forms.MessageBox.Show("You have clicked label " + ((System.Windows.Forms.Label) sender).Tag.ToString());
        }
    }
}


og i min knap


        void Command1Click(object sender, System.EventArgs e)
        {
           
            byte xtel;
            //int atel;
           
           
            for(xtel=1;xtel<7;xtel++)
            {
                       
                MyControlArray.AddNewLabel();
                MyControlArray[(xtel-1)].BackColor = System.Drawing.Color.Red;
                locX += this.r.Width+20;
               
   
            }
           
        }


men når jeg klikker på knappen får jeg flg. fejl



Exception System.NullReferenceException was thrown in debuggee:
Object reference not set to an instance of an object.

Command1Click() - c:\Documents and Settings\Thomas\Dokumenter\SharpDevelop Projects\lotto\MainForm.cs:63,5
OnClick()
OnClick()
OnMouseUp()
WmMouseUp()
WndProc()
WndProc()
WndProc()
OnMessage()
WndProc()
DebuggableCallback()
System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop()
RunMessageLoopInner()
RunMessageLoop()
Run()
Main() - c:\Documents and Settings\Thomas\Dokumenter\SharpDevelop Projects\lotto\MainForm.cs:27,4

og denne linje bliver gul

MyControlArray.AddNewLabel();

når jeg siger den skal break;
Avatar billede nielle Nybegynder
16. oktober 2006 - 10:43 #2
Koden virker hos mig (pånær at variablen "locX" ikke er defineret nogen steder). Jeg vil derfor gætte på at du blot har glemt at initialisere din vatiabel MyControlArray. Dette kunne f.eks. gøres i din forms Load-event:

        LabelArray MyControlArray;
        private void Form1_Load(object sender, EventArgs e)
        {
            MyControlArray = new LabelArray(this);
        }
Avatar billede hacked Nybegynder
16. oktober 2006 - 10:48 #3
Du skulle vel ikke have glemt at instantiere dit MyControlArray objekt i din Forms constructor?

fx:

public Form1()
{
    InitializeComponent(); // Bruger Visual Studio 2005 Pro
    MyControlArray = new LabelArray(this);
}

Jeg har fulgt guiden og der er ikke fejl i den. Jeg ænderede koden fra, at omhandle Buttons til Labels, som gør sig gældende i dit tilfælde.

Du burde nemlig fra du starter programmet kunne se een Label der er blevet added til din Form.

public LabelArray(System.Windows.Forms.Form host)
{
    HostForm = host;
    this.AddNewLabel();
}
Avatar billede hacked Nybegynder
16. oktober 2006 - 10:49 #4
Doh - for langsom igen.
Avatar billede thomaxz Nybegynder
16. oktober 2006 - 14:28 #5
Tak, det var derof, læg et svar.
Avatar billede nielle Nybegynder
16. oktober 2006 - 14:46 #6
Hvis malkor ellers er hurtigt nok til at nå at smide et svar, kan vi jo dele på denne her ;^)

... og et svar fra mig. :^)
Avatar billede hacked Nybegynder
16. oktober 2006 - 21:40 #7
:) takker - skal nok huske, at opdatere siden inden jeg lægger mit svar næste gang.
Avatar billede nielle Nybegynder
16. oktober 2006 - 21:47 #8
Kender det selv :^)
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