【问题标题】:How does DataGridVIewRow count cells? ArgumentOutOfRangeException occuredDataGridVIew Row 如何计算单元格?发生 ArgumentOutOfRangeException
【发布时间】:2022-11-11 03:04:05
【问题描述】:

我遇到 ArgumentOutOfRangeException 错误。原因是 Cells.Count 结果是 15,而我唯一的行是 5。

foreach (DataGridViewRow rw in this.dataGridView1.Rows)
{
    for (int i = 0; i < rw.Cells.Count; i++)
    {
        if (rw.Cells[i].Value != null || rw.Cells[i].Value != DBNull.Value || !String.IsNullOrEmpty(rw.Cells[i].Value.ToString()))
        {
            commcon.Open();

            //check if there is outstanding balances and with equal total with the collection partner unless partial or advance payment or for checking
            int obaccountid = 0;
            double obtotal = 0;

            int billno = 0;
            int accountid = 0;
            string accountno = "";
            string accountname = "";
            double total = 0;
            int cellnumber = 0;
            DateTime colldate;

            //setting value
            accountid = getAccountID(dataGridView1.Rows[i].Cells[1].Value.ToString());
            billno = getBillno(accountid);
            accountno = dataGridView1.Rows[i].Cells[1].Value.ToString();
            accountname = getProperAccountName(getAccountID(dataGridView1.Rows[i].Cells[1].Value.ToString()));
            total = Convert.ToDouble(dataGridView1.Rows[i].Cells[3].Value);
            cellnumber = (int)Convert.ToInt64(dataGridView1.Rows[i].Cells[14].Value);
            colldate = (DateTime)Convert.ToDateTime(dataGridView1.Rows[i].Cells[0].Value);

            //getting data from OB database
            //additional validation if the transaction month is same with the collection month and year
            using (SqlDataAdapter a = new SqlDataAdapter("SELECT TOP 1 total, accountid FROM [bicos-ob].dbo.[Outstanding Bills] where accountid="
                + accountid + " and MONTH([billing date]) = MONTH('" + colldate + "') and YEAR([billing date]) = YEAR('" + colldate + "')  order by id desc", commcon))
            {
                DataTable t = new DataTable();
                a.Fill(t);
                if (t != null && t.Rows.Count > 0)  
                {
                    obtotal = Convert.ToDouble(t.Rows[0][0]);
                    obaccountid = Convert.ToInt32(t.Rows[1][0]);

                    //execution if total of outstanding bill and collection is equal
                    if (obtotal == total && obaccountid == accountid)
                    {
                        SqlCommand cmd = new SqlCommand("[save__collection_RDPayments]", commcon);
                        cmd.CommandType = CommandType.StoredProcedure;
                        cmd.Parameters.AddWithValue("@billno", billno);
                        cmd.Parameters.AddWithValue("@accountid", accountid);
                        cmd.Parameters.AddWithValue("@accountno", accountno); //with Account Number Validation already. Format is already there.
                        cmd.Parameters.AddWithValue("@accountname", accountname);
                        cmd.Parameters.AddWithValue("@or", ORNumber);
                        cmd.Parameters.AddWithValue("@collectiondate", dataGridView1.Rows[i].Cells[0].Value.ToString());
                        cmd.Parameters.AddWithValue("@paymenttype", paymenttype);
                        cmd.Parameters.AddWithValue("@checkno", checkno);
                        cmd.Parameters.AddWithValue("@overpayment", 0);
                        cmd.Parameters.AddWithValue("@partialpayment", 0);
                        cmd.Parameters.AddWithValue("@userid", getUserID(user));
                        cmd.Parameters.AddWithValue("@RefNo", dataGridView1.Rows[i].Cells[7].Value.ToString());
                        cmd.ExecuteNonQuery();

                        //format: accountno, accountid, accountname
                        appendFiles("Posted payment of: " + dataGridView1.Rows[i].Cells[1].Value.ToString() + " " + getAccountID(dataGridView1.Rows[i].Cells[1].Value.ToString()) + " " +
                            getProperAccountName(getAccountID(dataGridView1.Rows[i].Cells[1].Value.ToString())));

                        string log = "Posted";
                        SqlCommand cmdlog = new SqlCommand("INSERT INTO CodeAventus_ePostingPortal.dbo.[audit_cr_log] (collectiondate, accountno, accountname, remarks, transactiondate, cellphonenumber) " +
                            "VALUES(@collectiondate, @accountno, @accountname, @remarks, @transactiondate, @cellphonenumber)", commcon);
                        cmdlog.Parameters.AddWithValue("@collectiondate", dataGridView1.Rows[i].Cells[0].Value.ToString());
                        cmdlog.Parameters.AddWithValue("@accoutno", accountno);
                        cmdlog.Parameters.AddWithValue("@accountname", accountname);
                        cmdlog.Parameters.AddWithValue("@remarks", log);
                        cmdlog.Parameters.AddWithValue("@transactiondate", System.DateTime.Now);
                        cmdlog.Parameters.AddWithValue("@cellphonenumber", cellnumber);

                        commcon.Close();
                    }
                    //overpayment
                    else if (obtotal < total && obaccountid == accountid)
                    {
                        string log = "Overpayment";
                        SqlCommand cmdlog = new SqlCommand("INSERT INTO CodeAventus_ePostingPortal.dbo.[audit_cr_log] (collectiondate, accountno, accountname, remarks, transactiondate, cellphonenumber) " +
                            "VALUES(@collectiondate, @accountno, @accountname, @remarks, @transactiondate, @cellphonenumber)", commcon);
                        cmdlog.Parameters.AddWithValue("@collectiondate", dataGridView1.Rows[i].Cells[0].Value.ToString());
                        cmdlog.Parameters.AddWithValue("@accountno", accountno);
                        cmdlog.Parameters.AddWithValue("@accountname", accountname);
                        cmdlog.Parameters.AddWithValue("@remarks", log);
                        cmdlog.Parameters.AddWithValue("@transactiondate", System.DateTime.Now);
                        cmdlog.Parameters.AddWithValue("@cellphonenumber", cellnumber);
                        cmdlog.ExecuteNonQuery();
                        commcon.Close();
                    }
                    //partial
                    else if (obtotal > total && obaccountid == accountid)
                    {
                        string log = "Paid amount is less than posted bill.";
                        SqlCommand cmdlog = new SqlCommand("INSERT INTO CodeAventus_ePostingPortal.dbo.[audit_cr_log] (collectiondate, accountno, accountname, remarks, transactiondate, cellphonenumber) " +
                            "VALUES(@collectiondate, @accountno, @accountname, @remarks, @transactiondate, @cellphonenumber)", commcon);
                        cmdlog.Parameters.AddWithValue("@collectiondate", dataGridView1.Rows[i].Cells[0].Value.ToString());
                        cmdlog.Parameters.AddWithValue("@accountno", accountno);
                        cmdlog.Parameters.AddWithValue("@accountname", accountname);
                        cmdlog.Parameters.AddWithValue("@remarks", log);
                        cmdlog.Parameters.AddWithValue("@transactiondate", System.DateTime.Now);
                        cmdlog.Parameters.AddWithValue("@cellphonenumber", cellnumber);
                        cmdlog.ExecuteNonQuery();
                        commcon.Close();
                    }
                    else if (obaccountid != accountid)
                    {
                        string log = "Wrong Account Number.";
                        SqlCommand cmdlog = new SqlCommand("INSERT INTO CodeAventus_ePostingPortal.dbo.[audit_cr_log] (collectiondate, accountno, accountname, remarks, transactiondate, cellphonenumber) " +
                            "VALUES(@collectiondate, @accountno, @accountname, @remarks, @transactiondate, @cellphonenumber)", commcon);
                        cmdlog.Parameters.AddWithValue("@collectiondate", dataGridView1.Rows[i].Cells[0].Value.ToString());
                        cmdlog.Parameters.AddWithValue("@accountno", accountno);
                        cmdlog.Parameters.AddWithValue("@accountname", accountname);
                        cmdlog.Parameters.AddWithValue("@remarks", log);
                        cmdlog.Parameters.AddWithValue("@transactiondate", System.DateTime.Now);
                        cmdlog.Parameters.AddWithValue("@cellphonenumber", cellnumber);
                        cmdlog.ExecuteNonQuery();
                        commcon.Close();
                    }
                    else
                    {
                        string log = "unknown";
                        SqlCommand cmdlog = new SqlCommand("INSERT INTO CodeAventus_ePostingPortal.dbo.[audit_cr_log] (collectiondate, accountno, accountname, remarks, transactiondate, cellphonenumber) " +
                            "VALUES(@collectiondate, @accountno, @accountname, @remarks, @transactiondate, @cellphonenumber)", commcon);
                        cmdlog.Parameters.AddWithValue("@collectiondate", dataGridView1.Rows[i].Cells[0].Value.ToString());
                        cmdlog.Parameters.AddWithValue("@accountno", accountno);
                        cmdlog.Parameters.AddWithValue("@accountname", accountname);
                        cmdlog.Parameters.AddWithValue("@remarks", log);
                        cmdlog.Parameters.AddWithValue("@transactiondate", System.DateTime.Now);
                        cmdlog.Parameters.AddWithValue("@cellphonenumber", cellnumber);
                        cmdlog.ExecuteNonQuery();
                        commcon.Close();
                    }
                }
                //datatable is null
                else
                {
                    MessageBox.Show("No data retrieved!", "MESSAGE", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    commcon.Close();
                }
            }
        }
        else
        {
            MessageBox.Show("Error. Check the column header", "MESSAGE", MessageBoxButtons.OK, MessageBoxIcon.Information);
            commcon.Close();
        }
    }
}

我不明白为什么 Cells.Count 是 15。 程序在 i = 5 处停止;而 Cells.Count 是 15。

更新了我的帖子。添加了更多代码。我希望有更多的建议。谢谢你。

【问题讨论】:

  • 你到底在//my code 做什么?
  • @Logarr 验证并将数据插入数据库。
  • 您是否尝试过查看调试器以验证在此循环中进行评估时您的计数实际上不是 15?这就是 Locals 窗口的用途。
  • 如果您研究如何使用 DB 提供程序对象,则不需要迭代行或列来插入、更新或从数据库中删除。
  • @Logarr 是的。 Cells.Count 实际上是 15。程序在 i=5 处停止。

标签: c#


【解决方案1】:

嗯,你的问题...

您的循环正在遍历您的 Cells 计数,但您正在使用 i 索引从您的 Rows 集合中进行选择。您的行上有(至少)15 个单元格,如下面的14 硬编码索引所示:

cellnumber = (int)Convert.ToInt64(dataGridView1.Rows[i].Cells[14].Value);

所以你是对的,你没有 15 行,但这不是你循环的数字。看起来你在这个循环中想要完成的事情一团糟。一开始,您正在检查当前单元格是否为空或空,这很好,但随后在循环内部您尝试访问特定单元格。您还没有检查这些单元格是否为空/空。

您是否只想检查标题行或其他内容?你的错误信息会让我相信。如果是这样,那么我将对您的 foreach 循环采取完全不同的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多