簡體   English   中英

c#索引超出了數組的范圍

[英]c# Index was outside the bounds of the array

您好,如果我將itemWS.getItemInfo(itemLis [i] .ToString())中的值(i)放入,我將收到“索引超出數組范圍”

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

(這是數據庫)

在此處輸入圖片說明

問題是如果我將[i]替換為[0]。 它將僅顯示數據庫中的第一個值項目

(如果我將[i]替換為[0],則為GUI)單擊任何按鈕將重復相同的輸出

在此處輸入圖片說明

請任何幫助將不勝感激。 我正在嘗試使用生成的新按鈕顯示來自MySQL的項目,這些按鈕將顯示在datagridview上。 謝謝

嘗試將i的值存儲在委托示例內的局部變量中:

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

實際執行委托時,i的值可能超出范圍。

更新:無法看到應用程序中的所有其他代碼,很難確定,但可能是委托執行時itemLis不再包含該索引處的項目。

嘗試使用foreach循環,這樣,當委托執行時,您將不會從itemLis數組中檢索項目。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM