You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:17:25