0

このような質問をいくつか検索しましたが、問題に対する良い答えが見つかりませんでした。

2 つのリストボックスがあり、1 つには小切手番号のリストが含まれ、もう 1 つには受取人のリストが含まれています。コードは正常に動作しており、ユーザー エラーを防ぐためにいくつかのエラー チェック機能を強化したところ、このメッセージが表示されるようになりました

インデックスが範囲外でした。負ではなく、コレクションのサイズより小さくなければなりません。パラメータ名:インデックス

デバッグでは、受取人リスト ボックスに 41 個の項目があることがわかります。これは正しいので、このイベントの小切手リストで選択が変更されると、その特定の小切手受取人を選択する必要があります。これは受取人リストの 2 番目で、私のインデックスの値は 1 で、このエラーが表示されます。

私は過去 2 時間、このエラーに頭を悩ませてきました... これが「問題のある」コードです。

(イベントハンドラ内) ...

queryReadType.Connection = conn;
conn.Open();
queryReadType.Parameters.Add("@fld1", SqlDbType.VarChar, 50).Value = checkNo;
SqlDataReader reader = queryReadType.ExecuteReader();
try
{
    int i, zid;
    while (reader.Read())
    {
        int.TryParse(reader["id"].ToString(), out zid);
        txtCheckNo.Text = reader["checkno"].ToString();
        if (option == 60) // Update
          originalCheckNo = txtCheckNo.Text;  
        int payeeId;
        int.TryParse(reader["payeeid"].ToString(), out payeeId);
        txtPayeeId.Text = payeeId.ToString();
        string payee = reader["payee"].ToString();
        for (i = 0; i < payeecnt; i++)
        {
            if (String.Compare(payee, lstPayee.Items[i].ToString()) == 0)
            {
                 lstPayee.ClearSelected();
                 //int j = lstPayee.Items.Count;  <---- shows 41
                 lstPayee.SetSelected(i, true); <--- the value of i is 1 which //is the correct payee for this check
                  break;
            }
         }
         DateTime dtissued = DateTime.MinValue;
         //DateTime dtcleared = DateTime.MinValue;
         colIndex = reader.GetOrdinal("dateissued");
         if (!reader.IsDBNull(colIndex))
               dtissued = reader.GetDateTime(colIndex);

.....

何が間違っている可能性があるのか​​ について誰かが光を当ててくれてありがとう.. . 一部のメンバーが、実際には問題に対処していないコメントを投稿していることに気付きました。これが既に回答されている場合は、リンクを投稿してください。

前もって感謝します

4

2 に答える 2

0

私の賭けは、payeecnt が正しい値を保持していないということです。その価値がどこから得られるのか、私にはわかりません。ただし、 for ブロックでは、次のように、payeecnt の代わりに Items.Count 値を使用します。

for (i = 0; i < lstPayee.Items.Count; i++) 
{
   if (String.Compare(payee, lstPayee.Items[i].ToString()) == 0) 
   {
      lstPayee.ClearSelected(); //int j = lstPayee.Items.Count; <---- shows 41 
      lstPayee.SetSelected(i, true); <--- the value of i is 1 which //is the correct payee for this check 
      break;
   }
}
于 2015-09-05T16:38:01.427 に答える