DataGridView行上下移动操作报错,请求技术协助
DataGridView行上下移动操作报错问题

我在DataGridView中执行行上下移动操作时出现如图错误,求解决。
上移按钮(Btn Up)代码:
if (dataGridView1.SelectedRows[0].Index != 0) { for (int j = 1; j < this.dataGridView1.Columns.Count; j++) { object tmp = this.dataGridView1[j, dataGridView1.SelectedRows[0].Index].Value; this.dataGridView1[j, dataGridView1.SelectedRows[0].Index].Value = this.dataGridView1[j, dataGridView1.SelectedRows[0].Index - 1].Value; this.dataGridView1[j, dataGridView1.SelectedRows[0].Index - 1].Value = tmp; } int a = dataGridView1.SelectedRows[0].Index; dataGridView1.ClearSelection(); this.dataGridView1.Rows[a - 1].Selected = true; }
下移按钮(Btn Down)代码:
if (dataGridView1.SelectedRows[0].Index != dataGridView1.Rows.Count - 2) { for (int j = 1; j < this.dataGridView1.Columns.Count; j++) { object tmp = this.dataGridView1[j, dataGridView1.SelectedRows[0].Index].Value; this.dataGridView1[j, dataGridView1.SelectedRows[0].Index].Value = this.dataGridView1[j, dataGridView1.SelectedRows[0].Index + 1].Value; this.dataGridView1[j, dataGridView1.SelectedRows[0].Index + 1].Value = tmp; } int i = dataGridView1.SelectedRows[0].Index; dataGridView1.ClearSelection(); this.dataGridView1.Rows[i + 1].Selected = true; }
保存按钮(Btn Save)代码:
DataTable dt = (DataTable)dataGridView1.DataSource; try { using (SqlCommandBuilder scb = new SqlCommandBuilder(sda)) { sda.Update(dt); } MessageBox.Show("Değişiklikler Kaydedildi."); } catch (Exception ee) { MessageBox.Show(ee.Message); } listele();
问题解决方法
1. 修复索引越界问题
- 所有按钮操作前先判断是否有选中行,避免
SelectedRows[0]抛出索引越界异常:if (dataGridView1.SelectedRows.Count == 0) return; - 下移按钮的判断条件错误,默认DataGridView会包含空的新行,修正判断逻辑:
int currentIndex = dataGridView1.SelectedRows[0].Index; if (currentIndex >= dataGridView1.Rows.Count - 1 || dataGridView1.Rows[currentIndex].IsNewRow) return;
2. 改用DataTable操作行(更稳定)
直接操作绑定的数据源而非单元格值,避免事件触发异常和繁琐的单元格遍历:
- 修正后的上移代码:
private void BtnUp_Click(object sender, EventArgs e) { if (dataGridView1.SelectedRows.Count == 0) return; int currentIndex = dataGridView1.SelectedRows[0].Index; if (currentIndex == 0 || dataGridView1.Rows[currentIndex].IsNewRow) return; DataTable dt = (DataTable)dataGridView1.DataSource; DataRow currentRow = dt.Rows[currentIndex]; dt.Rows.Remove(currentRow); dt.Rows.InsertAt(currentRow, currentIndex - 1); dataGridView1.ClearSelection(); dataGridView1.Rows[currentIndex - 1].Selected = true; } - 修正后的下移代码:
private void BtnDown_Click(object sender, EventArgs e) { if (dataGridView1.SelectedRows.Count == 0) return; int currentIndex = dataGridView1.SelectedRows[0].Index; DataTable dt = (DataTable)dataGridView1.DataSource; if (currentIndex >= dt.Rows.Count - 1 || dataGridView1.Rows[currentIndex].IsNewRow) return; DataRow currentRow = dt.Rows[currentIndex]; dt.Rows.Remove(currentRow); dt.Rows.InsertAt(currentRow, currentIndex + 1); dataGridView1.ClearSelection(); dataGridView1.Rows[currentIndex + 1].Selected = true; }
3. 保存操作注意点
- 确保
SqlDataAdapter(sda)的SelectCommand已正确配置,否则SqlCommandBuilder无法生成有效的更新语句。 - 若保存后
listele()方法会重新绑定数据源,可在绑定后恢复之前的选中索引,提升用户体验。
内容的提问来源于stack exchange,提问作者ismail
相关产品推荐
相关产品推荐

