【问题标题】:Index running out of bound in for loopfor循环中的索引超出范围
【发布时间】:2017-08-09 11:52:14
【问题描述】:

在我的 win forms 应用程序中,我有 2 个 listView:listView1 和 listView2。
listView1 具有用户选择的数据库表(一个或多个)
当按下按钮时,listView2 会显示与所选表相关的所有列。
当我从 listView1 中选择 2 个表时,嵌套循环超出范围,即使它显示 1 个表的所有列,但由于它超出范围,因此它不会选择第二个表的列。你能告诉我我哪里出错了吗? 这是我的代码:

conn.Open();
SqlCommand sc2 = new SqlCommand("select C_Name, T from (select CONCAT(Table_Schema,'.',Table_Name) T, Concat(Table_Name,'.',Column_Name) C_Name from  Information_Schema.columns) as Teo ;", conn);                
SqlDataAdapter sda2 = new SqlDataAdapter(sc2);
sda2.Fill(dt);
conn.Close();
DataRow[] foundrows;
string express;                
for (int i = 0; i < listView1.CheckedItems.Count; i++)
{                 
    MessageBox.Show(listView1.CheckedItems.Count.ToString());
    express="T ='" + listView1.CheckedItems[i].Text+"'";
    foundrows = dt.Select(express);
    MessageBox.Show(foundrows.Length.ToString());

    for (int p = 0; p < foundrows.Length; i++)
    {                        
        listView2.Items.Add(foundrows[i][1].ToString());                        
    }                        
}

【问题讨论】:

  • 实际的错误代码是什么,是哪一行抛出的?
  • 你的意思是在第二个循环中增加 i 索引吗? for (int p = 0; p
  • @Ehz 明白了。您的第二个循环在应该使用 p 时使用 i
  • 错误:“索引超出了数组的范围”

标签: c# visual-studio for-loop datatable


【解决方案1】:

您需要在第二个循环中同时更改递增的内容和用于索引的内容:

foundrows = dt.Select(express);
MessageBox.Show(foundrows.Length.ToString());

for (int p = 0; p < foundrows.Length; p++)
{                        
     listView2.Items.Add(foundrows[p][1].ToString());                        
} 

第二个循环中的 i++ 将导致您的索引增加超出 i

当 foundrows.Length != listView1.CheckedItems.Count 时,在第二个循环中使用 i 作为索引会导致越界异常,而且可能不是您想要的

【讨论】:

  • 为什么是 p 而不是 p?这只是为了更好地突出它吗?
  • 抱歉,这只是将变量加粗的降价,我认为我在代码视图中的格式不正确。我已经删除了
【解决方案2】:
for (int p = 0; p < foundrows.Length; i++)
{                        
    listView2.Items.Add(foundrows[i][1].ToString());                        
}            

应该是

for (int p = 0; p < foundrows.Length; p++)
{                        
    listView2.Items.Add(foundrows[p][1].ToString());                        
}            

【讨论】:

  • 也应该是p++
【解决方案3】:

它超出了范围,因为你有:

for (int p = 0; p < foundrows.Length; i++)
{                        
    listView2.Items.Add(foundrows[i][1].ToString());                        
}          

它应该是:

for (int p = 0; p < foundrows.Length; p++)
{                        
    listView2.Items.Add(foundrows[p][1].ToString());                        
}          

【讨论】:

    【解决方案4】:

    在第二个循环中不应该是“p”而不是“i”吗?

    for (int p = 0; p < foundrows.Length; p++)
         {                        
             listView2.Items.Add(foundrows[p][1].ToString());                        
         } 
    

    【讨论】:

    • 也应该是p++
    【解决方案5】:

    你确定,第二个表有两列吗?

    因为,你在做listView2.Items.Add(foundrows[i][1].ToString());

    foundrows[rowindex][cellindex]在第二个表里有吗?

    【讨论】:

    • 请不要发表评论作为答案。
    • 是的,sql命令显示了添加到数据表中的两列
    • @Abion47 你明白了,谢谢
    猜你喜欢
    • 2019-04-17
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多