列表框中的索引超出范围

时间:2015-09-05 15:53:53

标签: c# listbox indexoutofrangeexception

我已经搜索了几个这样的问题,但找不到我问题的好答案。

我有2个列表框,一个包含支票号码列表,另一个包含收款人列表。代码工作正常,我做了一些错误检查增强功能,以防止用户错误,现在我收到此消息

  

指数超出范围。必须是非负数且小于集合的大小。参数名称:index

在调试中我看到收款人列表框有41个项目 - 这是正确的,所以当在此事件中检查列表上的选择发生变化时,我必须选择该特定的支票收款人。它是收款人列表中的第二个,我的索引的值为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);

.....

我很感激有人在可能出现的问题上找到了解决方案 - 而且工作完美 - 再次将此代码更改为选中项目更改为检查列表框,请只有正面评论我在工作日有足够的行李已经...我注意到有些会员发表的评论没有真正解决问题,如果已经回复,请发布链接。

提前致谢

1 个答案:

答案 0 :(得分:0)

我的赌注是payeecnt没有保持正确的价值。我没有看到它从哪里获得价值。但是,在for block中使用Items.Count值而不是payeecnt,如下所示:

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