2017-03-17 61 views
2

在我的win窗体应用程序中,我有两个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());       
    }       
} 
+0

什么是实际的错误代码和行把它扔? – Abion47

+5

你的意思是在第二个循环中增加i索引吗? for(int p = 0; p Ehz

+3

@Ehz明白了。当它应该使用'p'时,你的第二个循环使用'i'。 – Abion47

回答

4

您需要更改这两个是什么递增,你在你的第二个循环使用的指标是什么:

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 ++在会导致你的指数增加的极限之外我< listView1.CheckedItems.Count

使用我在第二循环索引会导致越界异常时foundrows.Length!= listView1.CheckedItems.Count,而且可能不是你打算反正

+0

为什么** p **而不是p?这只是为了更好地突出它? – Akumaburn

+0

对不起,这只是降低到加粗变量,我不认为我在代码视图中正确格式。我已经删除它 – Ehz

1

确定,第二个表有两列?

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

foundrows[rowindex][cellindex]是它可以在第二个表?

+2

请不要发表评论作为答案。 – Abion47

+0

是的,sqlcommand显示了两列添加到数据表 – SQLserving

+0

@ Abion47你得到它,谢谢 – SQLserving

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

应该

+1

它也应该是'p ++'。 – Abion47

1

它不应该是 “P”,而不是 “我” 在第二循环中?

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

它也应该是'p ++'。 – Abion47

+0

当然,你是对的。我没有看到那一个。 – bauermann

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