我很熟悉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)
{
}
}
答案 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
发送所有必要的数据吗?