2017-03-17 9 views
2

私のwinフォームアプリケーションでは、2つのlistView:listView1とlistView2があります。
listView1には、ユーザーが選択したデータベーステーブルが1つ以上あります。
ボタンを押すと、選択したテーブルに関連するすべての列が表示されます。
listView1から2つのテーブルを選択すると、ネストされたループは1つのテーブルのすべての列を表示しますが、範囲外で実行されているため、選択された2番目のテーブルの列は取得されません。どこが間違っているのか教えていただけますか?ここで が私のコードです:インデックスがforループの範囲外で実行されています

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

2番目のループでiインデックスをインクリメントしていますか? for(int p = 0; p Ehz

+3

@Ehzはそれを得ました。 2番目のループは '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());       
} 

第二のループでは、私は++の限界の外をインクリメントするためにあなたのインデックスが発生します私< listView1.CheckedItems.Count

がfoundrows.Length!= listView1.CheckedItems.Count、とはおそらくないときに境界例外のうちの原因となります第二のループであなたのインデックスに私を使用することの何が

とにかく意図しました
+0

なぜp **の代わりに** p **?それはそれをより良く強調するだけですか? – Akumaburn

+0

申し訳ありませんが、私はコードビューで正しくフォーマットされていないと思われる変数を太字にするためのマークダウンでした。私はそれを削除しました – Ehz

1

はよろしいです、2番目の表は、2つの列があり?

ので、あなたはlistView2.Items.Add(foundrows[i][1].ToString());

foundrows[rowindex][cellindex]は、それが第二のテーブルで利用されていますか?

+2

解答としてコメントを投稿しないでください。 – Abion47

+0

はい、sqlコマンドは、データテーブル – SQLserving

+0

@ Abion47に追加された2つのカラムを表示します。ありがとう – SQLserving

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

+1

また、 'p ++'にする必要があります。 – Abion47

1

が、それは "P" の代わりに "i" の第二のループにすべきではないすべきですか?

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());       
}   
関連する問題