【问题标题】:Accessing a list through file?通过文件访问列表?
【发布时间】:2017-10-11 00:11:19
【问题描述】:

我在 java 方面非常有经验,但似乎无法从某种意义上弄清楚如何使用全局变量。

如何在 on 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)
    {

    }
}

【问题讨论】:

  • 为什么不把它变成一个私有类级别的字段,就像在 java 中那样?
  • 在 C# 中没有全局变量之类的东西。你能得到的最好的是static member of a public class。
  • @user3042332 您是否尝试过调试 menu_SelectedIndexChanged 并查看作为 sender 和 e 得到了什么?发件人被装在被认为是您的食物对象的对象中。

标签: c#


【解决方案1】:

您可以转换一个sender 对象,该对象应该正是持有您的数据源的那个人。但是从您的示例中不清楚为什么需要访问该列表? EventArgs e 不提供所有必要的数据吗?

【讨论】:

    【解决方案2】:

    最好的办法是让 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();
        }
    

    【讨论】:

      【解决方案3】:

      您的List&lt;Food&gt;() 用作名为menu 的控件的数据源。
      因此,您始终可以检索以List&lt;Food&gt; 形式访问数据源的相同列表

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

      不需要有“全局变量”。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-13
        • 2017-02-28
        • 2023-03-27
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多