通过文件访问列表?

时间:2017-05-11 20:14:19

标签: c#

我很熟悉java,并且似乎无法弄清楚如何在某种意义上使用全局变量。

如何在selectedIndexChanged方法中访问foodSource列表?我想拥有它,所以当选择一个项目时,它的价格会显示在一个单独的标签中。

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

    private void initFood()
    {
        var foodSource = new List<Food>();

        foodSource.Add(new Food { name = "Pizza", price = 10 });
        foodSource.Add(new Food { name = "Burger", price = 15 });
        foodSource.Add(new Food { name = "Chips", price = 5 });
        this.menu.DataSource = foodSource;
        menu.DisplayMember = "name";
    }

    private void menu_SelectedIndexChanged(object sender, EventArgs e)
    {


    }

    private void label1_Click(object sender, EventArgs e)
    {

    }
}

3 个答案:

答案 0 :(得分:4)

您的List<Food>()用作名为menu的控件的数据源 因此,您始终可以检索访问数据源的同一列表List<Food>

private void menu_SelectedIndexChanged(object sender, EventArgs e)
{
    List<Food> source = menu.DataSource as List<Food>;
    source.foo();
}

无需拥有全局变量&#39;周围。

更深入的解释:当您编写var foodSource = new List<Food>();时,您正在堆中分配一个内存区域来保存列表数据。对此区域的引用将分配给名为 foodSource 的局部变量,最后控件的 DataSource 属性将分配给同一引用。但是,作为 foodSource 在堆栈上创建的局部变量,当代码退出 initFood 方法时,它将被丢弃,但堆上的内存区域仍在使用中,因为DataSource属性保留对该区域的引用。当您的代码到达 SelectedIndexChanged 事件处理程序时,您只需使用as keyword对存储原始List<Food>的同一内存区域进行有效引用。

答案 1 :(得分:1)

您最好的选择是让foodSource成为Form1类的成员:

public partial class Form1 : Form
{
    private List<Food> foodSource;
    public Form1()
    {
        InitializeComponent();
        initFood();
    }

    private void initFood()
    {
        this.foodSource = new List<Food>();

        this.foodSource.Add(new Food { name = "Pizza", price = 10 });
        this.foodSource.Add(new Food { name = "Burger", price = 15 });
        this.foodSource.Add(new Food { name = "Chips", price = 5 });
        this.menu.DataSource = foodSource;
        menu.DisplayMember = "name";
    }
}

然后您可以从您的方法访问它。

    private void menu_SelectedIndexChanged(object sender, EventArgs e)
    {
        this.foodSource.foo();
    }

答案 2 :(得分:0)

您可以投射一个sender对象,该对象应该与拥有您数据源的人完全相同。但是从您的示例中,您不清楚为什么需要访问该列表?没有EventArgs e发送所有必要的数据吗?