Tony Gildea
Tony Gildea

Reputation: 1

Passing arrays to a method inside event C#

Im trying to create a section of a program, where a user presses a button and a image is placed in one of 9 pictureboxes. Each time the button is clicked, a different picturebox should be selected. However, before i get to that, i'm having trouble getting my method to see the arrays i am trying to pass it.

I have 2 arrays, Slots and SlotsUsed and i am trying to initalise them when the program starts. However, when i try to pass them to the method "randomBox" which is called within "Button1" visual studio says they do not exist. How can i make these arrays visible throughout my code?

Many thanks Anthony

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace pin_program
{
    public partial class Mainscreen : Form
    {
        //Sets where users files are to be stored (for later use)
        string activeDir = @"C:\Users\Tony\Downloads\Programs\pin program\Users";

        public Mainscreen()
        {
            InitializeComponent();
        }

        //method to generate random number
        private int RandomNumber(int min, int max)
        {
            Random random = new Random();
            return random.Next(min, max);
        }

        public void randomBox(int pictureVal, PictureBox[] Slots, bool[] SlotsUsed)
        {
            //generate random number
            int j = RandomNumber(0, 9);

            if (SlotsUsed[j] == false)
            {
                // Create image, assign it and set slots value to used
                Image newImage = Image.FromFile(@"C:\Users\Tony\Downloads\Programs\pin program\pin program\pin program\Images\" + pictureVal + ".jpg");
                Slots[j].Image = newImage;
                SlotsUsed[j] = true;
            }
            else
                do
                {
                    j = RandomNumber(0, 9);
                } while (SlotsUsed[j] == false);

            return;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //for use later
            string userName = textBox1.Text;
            //for use later
            label1.Visible = true;

            //test call of method.
            randomBox(1, Slots, SlotsUsed);
        }

        public void Mainscreen_Load(object sender, EventArgs e)
        {
            //array for slots
            PictureBox[] Slots = new PictureBox[9];
            Slots[0] = pictureBox1;
            Slots[1] = pictureBox2;
            Slots[2] = pictureBox3;
            Slots[3] = pictureBox4;
            Slots[4] = pictureBox5;
            Slots[5] = pictureBox6;
            Slots[6] = pictureBox7;
            Slots[7] = pictureBox8;
            Slots[8] = pictureBox9;

            //array for used slots
            bool[] SlotsUsed = new bool[9];
            for (int i = 0; i != (SlotsUsed.Length); i++)
            {
                SlotsUsed[i] = false;
            }
        }
    }
}

EDIT: I dont seem to be able to post comments for some reason, so i'll just ask here. How would i declare my arrays as instance variables instead of local? Does instance variable have another name i might know it by?

CHeers

Upvotes: 0

Views: 291

Answers (2)

well, the easiest way to do this would be to declare a field.

protected PictureBox[] Slots

inside your Form class (outside of any methods.

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1500815

Currently you're declaring Slots and SlotsUsed as local variables in Mainscreen_Load. They need to be instance variables in your form, as otherwise you can't refer to them elsewhere - and indeed they won't logically exist elsewhere. They're part of the state of your form, so they should be instance variables.

Additionally, your approach for generating random numbers is broken - see my article on random numbers for more information.

I'd also add that you might consider just using a single collection, shuffling it to start with, and then removing items from it as you go - that way you can easily tell when you've run out of images, and you don't have to loop round until you find an unused slot.

Upvotes: 2

Related Questions