Tomas Pangonis
Tomas Pangonis

Reputation: 29

Access programmatically created object in another method

I have an array of dataGridViews created programmatically in one method. how Can I access the array from another method? (in this case Button Click). I can't declare it as member of class because I don't know how big will array be because it depends on file

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

    public void Form1_Load(object sender, EventArgs e)
    {
        string[] lines = System.IO.File.ReadAllLines(@"..\..\Diets.txt");

        int diet_num = 0;
        int grid_num = 0;
        foreach (string x in lines) diet_num++;
        grid_num = (diet_num / Constant.DATAGRID_DIETS_IN_GRID) + 1;
        Font dataGridFont = new Font("Microsoft Sans Serif",12, FontStyle.Bold);
        Color c = Color.FromArgb(255,255,128);

        DataGridView[] grid = new DataGridView[grid_num];
        for (int i = 0; i < grid_num; i++)
        {
            grid[i] = new DataGridView();
            grid[i].Tag = i;
            grid[i].Parent = this;
            grid[i].Location = new Point(12, 12 + (8 + Constant.DATAGRID_ROW_HEIGHT * 2) * i);
            grid[i].Visible = true;
            grid[i].RowHeadersVisible = false;
            grid[i].Height = Constant.DATAGRID_ROW_HEIGHT * 2;
            grid[i].Width = Constant.DATAGRID_COLUMN_SIZE * Constant.DATAGRID_DIETS_IN_GRID + 3;
            grid[i].UserAddedRow += Form1_UserAddedRow;
            grid[i].RowTemplate.Height = Constant.DATAGRID_ROW_HEIGHT;
            grid[i].ColumnHeadersHeight = Constant.DATAGRID_ROW_HEIGHT;
            grid[i].AllowUserToResizeColumns = false;
            grid[i].AllowUserToResizeRows = false;
            grid[i].MultiSelect = false;
            grid[i].ColumnHeadersHeightChanged += Form1_ColumnHeadersHeightChanged;
            grid[i].MouseLeave += Form1_MouseLeave;
            grid[i].Font = dataGridFont;
            grid[i].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            grid[i].ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            grid[i].ColumnHeadersDefaultCellStyle.BackColor = c;
            grid[i].EnableHeadersVisualStyles = false;

        }
        this.Width = Constant.DATAGRID_COLUMN_SIZE * Constant.DATAGRID_DIETS_IN_GRID + 40;

        int count = 0;
        foreach (string x in lines)
        {
            DataGridViewColumn col = new DataGridViewTextBoxColumn();
            col.Width = Constant.DATAGRID_COLUMN_SIZE;

            col.HeaderText = x;
            int colIndex = grid[count/12].Columns.Add(col);
            count++;
        }

    }

    private void button1_Click(object sender, EventArgs e)
    {
        grid[0].Visible = false; //can't do that
    }
}

Upvotes: 0

Views: 55

Answers (2)

Christopher
Christopher

Reputation: 9824

It must either be a variable in scope for both functions (it can still be one function that sets it), or you have to hand it as a parameter for the 2nd Function (only works if function 1 calls function 2).

"I can't declare it as member of class, because i don't know how big will array be, because it depends on file" That sentence makes no sense for me. The array will always take the same amount of storage, no mater where you reference it. You obviously need it in both functions. So it must be avalible for both functions.

What exactly is the problem you are trying to avoid by not making it a class member?

Upvotes: 0

BWA
BWA

Reputation: 5764

You can move grid to class scope:

public partial class Form1 : Form
{
    DataGridView[] grid = null;

    public void Form1_Load(object sender, EventArgs e)
    {    
        ...
        grid = new DataGridView[grid_num];
        ...
    } 
}

Upvotes: 1

Related Questions