以下是代码, 数据源 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();//显示关闭窗体 }
System.IndexOutOfRangeException: “索引 -1 没有值” 错误通常发生在尝试访问 DataGridView 的行时,该行没有被有效选择或不存在。在你的代码中,问题可能出在以下几个方面:
System.IndexOutOfRangeException: “索引 -1 没有值”
DataGridView
sd.dataGridView1.CurrentRow
null
CurrentRow.Cells["TC001"]
SELECTCOPTD
为了防止 IndexOutOfRangeException 错误,可以在访问 CurrentRow 之前添加适当的检查,并且可以改进错误处理。以下是优化后的代码示例:
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(); // 关闭窗体 } }
确保 sd.dataGridView1 在 SELECTCOPTD 窗体中已经绑定了数据源,并且数据源中确实有数据。
sd.dataGridView1
调试并确认CurrentRow不为空:
SelectionMode
通过增加对 CurrentRow 和行索引的检查,可以避免 IndexOutOfRangeException 错误。此外,确保 DataGridView 正确绑定数据源并包含数据,这样可以减少出现异常的可能性。如果问题依旧存在,可以通过调试进一步检查 DataGridView 中的数据和用户的选择情况。