2017-11-22 4 views
-1

データテーブルに2行あり、最初に "P"と "B"が含まれています。行データテーブルをループするだけで最初の行がチェックされ、次の行に続かないC#

SqlCommand cmd = new SqlCommand("SELECT * FROM Personel where Kode_Personel LIKE '%P%' ", con); 
SqlDataAdapter sda = new SqlDataAdapter(cmd); 
DataTable dt = new DataTable(); 
con.Open(); 
sda.Fill(dt); 
con.Close(); 

int j = 0; 
foreach (DataRow row in dt.Rows) 
{ 

    j++; 
    cekjabatan = dt.Rows[0].ItemArray[2].ToString(); //this value not change to next row 
    cekkode = dt.Rows[0].ItemArray[0].ToString(); //this value not change to next row 

    if (cekkode.Contains("A") && cekkode.Contains("P") || cekkode.Contains("B") && cekkode.Contains("P") || cekkode.Contains("C") && cekkode.Contains("P")) 
    { 
     ceksubstring = cekkode.Substring(0, 4); 
    } 
    else if (cekkode.Contains("P") && !cekkode.Contains("B")) 
    { 
     ceksubstring = cekkode.Substring(0, 3); 
    } 
} 
+1

を削除することができますが、最初の行を意味し、 'dt.Rows [0]を'使用しています。 'row'(ループ変数)を使いたいかもしれません。 –

+0

hehe my bad、ありがとう –

答えて

1
cekjabatan = dt.Rows[0].ItemArray[2].ToString(); //this value not change to next row 

あなたは常に各反復で同じ位置にアクセスするため。

あなたはイテレータ

cekjabatan = dt.Rows[j].ItemArray[2].ToString(); 

としてインスタンス変数jを使用しますが(forループブロック内の最後の文のように)すべてのassingments後にそれをインクリメントする用心、またはあなたが失うことになることができますいずれか最初の要素。

しかし、この解決策では、イテレータ変数rowは時代遅れになります。それが意図されたとおりにループ変数を使用する必要があります。

foreach (DataRow row in dt.Rows) 
{ 

    cekjabatan = row.ItemArray[2].ToString(); //this value not change to next row 
    cekkode = row.ItemArray[0].ToString(); //this value not change to next row 

    if (cekkode.Contains("A") && cekkode.Contains("P") || cekkode.Contains("B") && cekkode.Contains("P") || cekkode.Contains("C") && cekkode.Contains("P")) 
    { 
     ceksubstring = cekkode.Substring(0, 4); 
    } 
    else if (cekkode.Contains("P") && !cekkode.Contains("B")) 
    { 
     ceksubstring = cekkode.Substring(0, 3); 
    } 
} 

この場合、あなたは完全にint j

関連する問題