小能豆

C# datagridview数据源是强类型,点击数据区域的时候提示 System.IndexOutOfRangeException:“索引 -1 没有值

javascript

以下是代码, 数据源 listzzfson 是强类型,点击datagridview数据区域的时候,老是提示
System.IndexOutOfRangeException:“索引 -1 没有值 报错, 是不是datagridview 不太兼容强类型呢? 以下是代码 :

private void butselectCOPTD_Click(object sender, EventArgs e)
{
//业务员一定要选择,如果不选择,不能添加销售订单
if (txtYWcode.SelectedValue == null)
{
MessageBox.Show(“业务员一定要填写,不填写,不能添加销售订单”);
return;
}
string mv001 = txtYWcode.SelectedValue.ToString();
SELECTCOPTD sd=new SELECTCOPTD(mv001);
sd.ShowInTaskbar = false;
sd.ShowDialog();
if (sd.DialogResult == DialogResult.OK && sd.dataGridView1.CurrentRow != null)
{
string TD001 = sd.dataGridView1.CurrentRow.Cells[“TC001”].FormattedValue.ToString();
string TD002 = sd.dataGridView1.CurrentRow.Cells[“TC002”].FormattedValue.ToString();
string custom = sd.dataGridView1.CurrentRow.Cells[“MA002”].FormattedValue.ToString();
//获取订单的强类型
Maticsoft.BLL.COPTD coptdbll=new Maticsoft.BLL.COPTD();
//过滤条件
string strwhere = $”TD001=’{TD001}’ AND TD002=’{TD002}’“;
List listcoptd = coptdbll.GetModelList(strwhere);
foreach (Maticsoft.Model.COPTD imodel in listcoptd)
{
Maticsoft.Model.ZZFson modelson = new Maticsoft.Model.ZZFson();
modelson.TD001= imodel.TD001 ;
modelson.TD002= imodel.TD002 ;
modelson.TD003= imodel.TD003 ;
listzzfson.Add(modelson);
}
dataGridView1.DataSource = null;
dataGridView1.DataSource = listzzfson;

        }
        sd.Close();//显示关闭窗体
    }

阅读 39

收藏
2024-06-22

共1个答案

小能豆

System.IndexOutOfRangeException: “索引 -1 没有值” 错误通常发生在尝试访问 DataGridView 的行时,该行没有被有效选择或不存在。在你的代码中,问题可能出在以下几个方面:

  1. 没有有效选择行:当 sd.dataGridView1.CurrentRownull 时,CurrentRow.Cells["TC001"] 等访问会引发异常。
  2. DataGridView 的数据源或绑定的问题:确保你的 DataGridViewSELECTCOPTD 窗体中正确绑定了数据源。

为了防止 IndexOutOfRangeException 错误,可以在访问 CurrentRow 之前添加适当的检查,并且可以改进错误处理。以下是优化后的代码示例:

private void butselectCOPTD_Click(object sender, EventArgs e)
{
    // 业务员一定要选择,如果不选择,不能添加销售订单
    if (txtYWcode.SelectedValue == null)
    {
        MessageBox.Show("业务员一定要填写,不填写,不能添加销售订单");
        return;
    }

    string mv001 = txtYWcode.SelectedValue.ToString();
    SELECTCOPTD sd = new SELECTCOPTD(mv001);
    sd.ShowInTaskbar = false;
    sd.ShowDialog();

    if (sd.DialogResult == DialogResult.OK && sd.dataGridView1.CurrentRow != null)
    {
        var currentRow = sd.dataGridView1.CurrentRow;

        if (currentRow.Index >= 0)  // 检查当前行的索引是否有效
        {
            string TD001 = currentRow.Cells["TC001"].FormattedValue.ToString();
            string TD002 = currentRow.Cells["TC002"].FormattedValue.ToString();
            string custom = currentRow.Cells["MA002"].FormattedValue.ToString();

            // 获取订单的强类型
            Maticsoft.BLL.COPTD coptdbll = new Maticsoft.BLL.COPTD();
            // 过滤条件
            string strwhere = $"TD001='{TD001}' AND TD002='{TD002}'";
            List<Maticsoft.Model.COPTD> listcoptd = coptdbll.GetModelList(strwhere);

            foreach (Maticsoft.Model.COPTD imodel in listcoptd)
            {
                Maticsoft.Model.ZZFson modelson = new Maticsoft.Model.ZZFson
                {
                    TD001 = imodel.TD001,
                    TD002 = imodel.TD002,
                    TD003 = imodel.TD003
                };

                listzzfson.Add(modelson);
            }

            dataGridView1.DataSource = null;
            dataGridView1.DataSource = listzzfson;
        }
        else
        {
            MessageBox.Show("请先选择一行数据。");
        }

        sd.Close(); // 关闭窗体
    }
}

进一步检查

  1. 确保 SELECTCOPTD 窗体中 DataGridView 的数据源正确绑定
  2. 确保 sd.dataGridView1SELECTCOPTD 窗体中已经绑定了数据源,并且数据源中确实有数据。

  3. 调试并确认CurrentRow不为空

  4. 你可以在调试时检查 sd.dataGridView1.CurrentRow 是否为 null
  5. 如果 CurrentRownull,请检查 DataGridViewSelectionMode 属性,以及用户是否选择了一行。

总结

通过增加对 CurrentRow 和行索引的检查,可以避免 IndexOutOfRangeException 错误。此外,确保 DataGridView 正确绑定数据源并包含数据,这样可以减少出现异常的可能性。如果问题依旧存在,可以通过调试进一步检查 DataGridView 中的数据和用户的选择情况。

2024-06-22