索引在for循环中运行超出范围

时间:2017-03-17 19:31:02

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

在我的win表单应用程序中,我有2个listViews: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());                        
    }                        
}

5 个答案:

答案 0 :(得分:3)

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

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

在findrows.Length!= listView1.CheckedItems.Count中使用i作为第二个循环中的索引将导致越界异常,并且可能不是你想要的

答案 1 :(得分:1)

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

答案 2 :(得分:1)

它已超出界限,因为你有:

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

答案 3 :(得分:0)

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

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

foundrows[rowindex][cellindex]可以在第二个表中找到吗?

答案 4 :(得分:0)

不应该是&#34; p&#34;而不是&#34;我&#34;在第二个循环?

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