【问题标题】:InvalidArgument=Value of'3' is not valid for 'index'. parameter name: indexInvalidArgument=“3”的值对“索引”无效。参数名称:索引
【发布时间】:2015-09-02 17:11:57
【问题描述】:

我的代码中有这个错误: InvalidArgument=“3”的值对“索引”无效。参数名称:索引, 当我只想填充列表视图的一部分时! 这是我的代码:

 MySqlCommand cmd = new MySqlCommand("select acc_Id,acc_Name,acc_Place from accounts where archived=0 and  cus_Sup=" + 0 , objConn);
                    MySqlDataReader dataReader = cmd.ExecuteReader();
                    int i = 0;
                    while (dataReader.Read())
                    {
                        if (i % 2 == 0)
                            listView2.Items.Add(dataReader.GetValue(0).ToString()).BackColor = Color.Lavender;
                        else
                            listView2.Items.Add(dataReader.GetValue(0).ToString());

                        listView2.Items[i].SubItems.Add(dataReader.GetString(1).ToString());

                        listView2.Items[i].SubItems.Add((dataReader.IsDBNull(2) ? "No place added" : dataReader.GetString(2)));
                        //------------------------------------I meant here !
                        listView2.Items[i].SubItems.Add("0");
                        listView2.Items[i].SubItems.Add("0");
                        listView2.Items[i].SubItems.Add("0");

                    }
                    dataReader.Close();


                    //-------------load bills
                    for (int x = 0; x < listView2.Items.Count; x++)
                    {
                        cmd = new MySqlCommand("select c.acc_Id,a.bill_Number,a.bill_Date,c.acc_Name,Sum( (b.de_Quantity * b.de_Price) - ((b.de_Quantity * b.de_Price)*b.de_DisRate/100) ),a.bill_TaxRate,a.bill_DisRate,a.bill_Note,c.acc_Place from (accounts c right JOIN bills a on c.acc_Id = a.bill_From) LEFT JOIN  bill_Details b on a.bill_Id = b.bill_Id where c.acc_Id = " + listView2.Items[x].SubItems[0].Text + " group by a.bill_Id,a.bill_Number,a.bill_Date,c.acc_Name,a.bill_TaxRate,a.bill_DisRate,a.bill_Note,c.acc_Place ", objConn);
                        dataReader = cmd.ExecuteReader();

                        decimal totalSum = 0, summBills = 0;
                        i = 0;
                        while (dataReader.Read())
                        {

                            totalSum = decimal.Parse(dataReader.IsDBNull(4) ? "0" : dataReader.GetDecimal(4).ToString("n2"));
                            totalSum -= (totalSum * decimal.Parse(dataReader.IsDBNull(6) ? "0" : dataReader.GetDecimal(6).ToString("n2")) / 100);
                            totalSum += (totalSum * decimal.Parse(dataReader.IsDBNull(5) ? "0" : dataReader.GetDecimal(5).ToString("n2")) / 100);
                            summBills += totalSum;
                            i++;
                        }
                        //MessageBox.Show(dataReader.GetValue(0).ToString()+"   "+summBills.ToString());
                        listView2.Items[x].SubItems[3].Text = summBills.ToString("n2");// the error here !

                        dataReader.Close();

                    }

它只是打印第一条记录的值! ,当它移动到第二个时出现错误!

【问题讨论】:

    标签: c# mysql


    【解决方案1】:

    您已为每个 ListView 项添加了 3 个子项。它们将是 Items[x].SubItems[0] 到 SubItems[2]。您需要添加 4 个子项才能使用子项[3]。

    编辑:

    当您在顶部循环中添加项目时,您不会增加 i - 您需要将顶部循环更改为:

                int i = 0;
                while (dataReader.Read())
                {
                    if (i % 2 == 0)
                        listView2.Items.Add(dataReader.GetValue(0).ToString()).BackColor = Color.Lavender;
                    else
                        listView2.Items.Add(dataReader.GetValue(0).ToString());
    
                    listView2.Items[i].SubItems.Add(dataReader.GetString(1).ToString());
    
                    listView2.Items[i].SubItems.Add((dataReader.IsDBNull(2) ? "No place added" : dataReader.GetString(2)));
                    //------------------------------------I meant here !
                    listView2.Items[i].SubItems.Add("0");
                    listView2.Items[i].SubItems.Add("0");
                    listView2.Items[i].SubItems.Add("0");
    
                    i++;
                }
                dataReader.Close();
    

    否则,您每次都在向 ListView 添加一个新项目,但每次都将 SubItems 添加到 listView2.Items[0]。这就是为什么第二个失败的原因。 Items[0] 有 5 个子项的倍数,其余的则没有。

    【讨论】:

    • 我不知道你所说的“之前”是什么意思。仅添加了 3 个子项:listView2.Items[x].SubItems[3].Text = summBills.ToString("n2");在运行时总是会失败。添加第 4 个子项或将其更改为 listView2.Items[x].SubItems[2].Text = summBills.ToString("n2");
    • 检查编辑! ,我在添加子项的地方添加了注释!
    • 对不起 - //-----我的意思是这里!错误所在的行?还是我现在看到您正在添加额外的子项目?
    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多