c# 索引超出了数组的范围

标签 c# mysql visual-studio-2010 visual-studio c#-4.0

您好,如果我将值 (i) 放入 itemsWS.getItemInfo(itemLis[i].ToString()) 中,我会收到“索引超出数组范围”

    object[] itemDetails;
    object[] itemLis = itemsWS.searchItem("", "bread", "all");
    int xs = 35;
    int clefts = 0;

    for (int i = 0; i < itemLis.Length; i++)

    {
        itemDetails = itemsWS.getItemInfo(itemLis[i].ToString());
        Button myButtons = new Button();
        myButtons.Click += delegate
        {

            dataGridView1.ColumnCount = 11;

            dataGridView1.Columns[0].Name = "Item Code";
            dataGridView1.Columns[1].Name = "Description";
            dataGridView1.Columns[2].Name = "Sale Price";
            dataGridView1.Columns[3].Name = "Category";
            dataGridView1.Columns[4].Name = "Type";
            dataGridView1.Columns[5].Name = "Status";
            dataGridView1.Columns[6].Name = "Low Count";
            dataGridView1.Columns[7].Name = "Medium Count";
            dataGridView1.Columns[8].Name = "High Count";
            dataGridView1.Columns[9].Name = "Item Picture";
            dataGridView1.Columns[10].Name = "TEST";

            //here is where i'm getting error if i put i on the []

            itemDetail = itemsWS.getItemInfo(itemLi[i].ToString());

            //

            dataGridView1.Rows.Add(itemDetail);
            MessageBox.Show("data grid displayed!");

        };


        myButtons.Text = itemDetails[1].ToString() + "\n  " + itemDetails[2].ToString();
        myButtons.Top = cleft * 180;
        myButtons.Left = 70;
        myButtons.Location = new Point(xs, clefts);
        myButtons.Size = new Size(100, 60);
        tabPage1.Controls.Add(myButtons);
        xs += 135;

        if (xs >= 537)
        {
            xs = 35;
            clefts += 80;
        }

(这是数据库)

enter image description here

问题是如果我用[0]替换[i]。它只会显示数据库中的第一个值项

(如果我将 [i] 替换为 [0],这是 GUI)单击的任何按钮都会重复相同的输出

enter image description here

请提供任何帮助,我们将不胜感激。我正在尝试使用生成的新按钮显示来自 MySQL 的项目,这些按钮将显示在 datagridview 上。谢谢

最佳答案

尝试将 i 的值存储在委托(delegate)示例内的局部变量中:

myButtons.Click += delegate
{
  …
  int local_i = i;
  itemDetail = itemsWS.getItemInfo(itemLis[local_i].ToString());
  …
}

在委托(delegate)实际执行时,i 的值可能超出范围。

更新: 如果没有看到应用程序中的所有其他代码,很难确定,但在委托(delegate)执行时,itemLis 可能不再包含该索引处的项目。

尝试使用 foreach 循环,这样当委托(delegate)执行时,您就不会从 itemLis 数组中检索项目。

foreach (var item in itemLis)
{
 itemDetails = itemsWS.getItemInfo(item);
    ....
    myButtons.Click += delegate
         {
         ...
         itemDetail = itemsWS.getItemInfo(item);
         ...    
     }
  ...
}

关于c# 索引超出了数组的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31984702/

相关文章:

mysql - SQL 按另一列选择具有最新日期时间组的行

visual-studio - ASP.NET 网站或 Web 应用程序中缺少 Visual Studio 2010 工具箱项目?

visual-studio-2010 - 如何在 Visual Studio 2010 中检查文件的编码?

c++ - FILE *f 在 C++ 中初始化为什么?

c# - 是否在垃圾回收期间调用了所有终结器?

c# - 将 PHP HMAC SHA256 转换为 C#

PHP MySQL 在非对象上调用成员函数 execute()

php - 登录 php 和 mysqli

c# - 如何在反序列化对象后创建用于加载 XML 文件的 XDocument 实例?

c# - 如何从 JToken 获取字符串值