【问题标题】:Access programmatically created object in another method以另一种方法访问以编程方式创建的对象
【发布时间】:2017-05-26 10:16:12
【问题描述】:

我在一个方法中以编程方式创建了一组 dataGridView。如何从另一种方法访问数组? (在这种情况下按钮单击)。我不能将它声明为类的成员,因为我不知道数组有多大,因为它取决于文件

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
    }
}

【问题讨论】:

  • " 如何从其他方法访问数组?"一点也不,因为您的数组仅存在于该方法中。你必须在你的班级中创建一个持有 gridview-instances 的成员。

标签: c# forms winforms


【解决方案1】:

您可以将grid 移动到类范围:

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

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

【讨论】:

  • 非常感谢 :)
【解决方案2】:

它必须是两个函数范围内的变量(它仍然可以是一个设置它的函数),或者您必须将其作为第二个函数的参数(仅在函数 1 调用函数 2 时才有效)。

“我不能将它声明为类的成员,因为我不知道数组有多大,因为它取决于文件” 这句话对我来说毫无意义。阵列将始终占用相同数量的存储空间,无论您在何处引用它。您显然在这两个功能中都需要它。所以它必须对这两个功能都可用。

通过不将其设为类成员,您究竟想避免什么问题?

【讨论】:

    猜你喜欢
    • 2017-10-24
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多