如何在KeyUp或Keydown按下上移/下移gridview选择的行

时间:2013-04-26 09:21:20

标签: c#

enter image description here

  1. 用户选择一行
  2. 会有向上箭头和向下箭头。
  3. 如果用户想要向上移动,则用户点击向上箭头按钮
  4. 如果用户想要向下移动,则用户点击向下箭头按钮
  5. 如果行位于顶部,则向上箭头按钮将被禁用
  6. 如果行位于底部,则向下箭头按钮将被禁用
  7. 我尝试了这段代码,但根本没有为上述场景工作

    private void key_up(object sender,EventArgs e)

    {
        if (dataGridView1.CurrentRow == null) return;
        if (dataGridView1.CurrentRow.Index - 1 >= 0)
        {
    
            dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.CurrentRow.Index - 1].Cells[0];
            dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Selected = true;
        }
    }
    

7 个答案:

答案 0 :(得分:15)

要做的是, 在key_up或按钮上单击 1)获取当前选定的行索引 2)只要索引+1小于行数,就将当前选中的行设置为(index + 1)。

点击key_Down或按钮取消否定。

    private void dataGridView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode.Equals(Keys.Up))
        {
            moveUp();
        }
        if (e.KeyCode.Equals(Keys.Down))
        {
            moveDown();
        }
        e.Handled = true;
    }

    private void moveUp()
    {
        if (dataGridView1.RowCount > 0)
        {
            if (dataGridView1.SelectedRows.Count > 0)
            {
                int rowCount = dataGridView1.Rows.Count;
                int index = dataGridView1.SelectedCells[0].OwningRow.Index;

                if (index == 0)
                {
                    return;
                }
                DataGridViewRowCollection rows = dataGridView1.Rows;

                // remove the previous row and add it behind the selected row.
                DataGridViewRow prevRow = rows[index - 1];
                rows.Remove(prevRow);
                prevRow.Frozen = false;
                rows.Insert(index, prevRow);
                dataGridView1.ClearSelection();
                dataGridView1.Rows[index - 1].Selected = true;
            }
        }
    }

    private void moveDown()
    {
        if (dataGridView1.RowCount > 0)
        {
            if (dataGridView1.SelectedRows.Count > 0)
            {
                int rowCount = dataGridView1.Rows.Count;
                int index = dataGridView1.SelectedCells[0].OwningRow.Index;

                if (index == (rowCount - 2)) // include the header row
                {
                    return;
                }
                DataGridViewRowCollection rows = dataGridView1.Rows;

                // remove the next row and add it in front of the selected row.
                DataGridViewRow nextRow = rows[index + 1];
                rows.Remove(nextRow);
                nextRow.Frozen = false;
                rows.Insert(index, nextRow);
                dataGridView1.ClearSelection();
                dataGridView1.Rows[index + 1].Selected = true;
            }
        }
    }

你可以看到我已经将上下移动方法分开了,所以如果你想使用按钮点击事件而不是按键和按键事件,你可以在需要时调用它们。

答案 1 :(得分:5)

清理了Jegan的代码并使其适用于多个datagridviews。

    private static void MoveUp(DataGridView dgv)
    {
        if (dgv.RowCount <= 0) 
            return;

        if (dgv.SelectedRows.Count <= 0) 
            return;

        var index = dgv.SelectedCells[0].OwningRow.Index;

        if (index == 0) 
            return; 

        var rows = dgv.Rows;
        var prevRow = rows[index - 1];
        rows.Remove(prevRow);
        prevRow.Frozen = false;
        rows.Insert(index, prevRow);
        dgv.ClearSelection();
        dgv.Rows[index - 1].Selected = true;
    }

    private static void MoveDown(DataGridView dgv)
    {
        if (dgv.RowCount <= 0) 
            return;

        if (dgv.SelectedRows.Count <= 0) 
            return;

        var rowCount = dgv.Rows.Count;
        var index = dgv.SelectedCells[0].OwningRow.Index;

        if (index == (rowCount - 2)) // include the header row
            return;

        var rows = dgv.Rows;
        var nextRow = rows[index + 1];
        rows.Remove(nextRow);
        nextRow.Frozen = false;
        rows.Insert(index, nextRow);
        dgv.ClearSelection();
        dgv.Rows[index + 1].Selected = true;
    }

答案 2 :(得分:0)

如果您想根据需要多次上下移动选定的行,可以使用此代码移动:

向上:

if (dataGridView1.SelectedRows[0].Index != 0) {
  for (int j = 0; 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;
}

下:

 if (dataGridView1.SelectedRows[0].Index != dataGridView1.Rows.Count - 2) {
   for (int j = 0; 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;
 }

答案 3 :(得分:0)

对我来说这很有效:

 public static void MoveUp(DataGridView dgv)
    {
        if (dgv.RowCount <= 0)
            return;

        if (dgv.SelectedRows.Count <= 0)
            return;

        var index = dgv.SelectedCells[0].OwningRow.Index;

        if (index == 0)
            return;

        var rows = dgv.Rows;
        var prevRow = rows[index - 1];
        rows.Remove(prevRow);
        prevRow.Frozen = false;
        rows.Insert(index, prevRow);
        dgv.ClearSelection();
        dgv.Rows[index - 1].Selected = true;
    }

    public static void MoveDown(DataGridView dgv)
    {
        if (dgv.RowCount <= 0)
            return;

        if (dgv.SelectedRows.Count <= 0)
            return;

        var rowCount = dgv.Rows.Count;
        var index = dgv.SelectedCells[0].OwningRow.Index;

        if (index == rowCount - 1) // Here used 1 instead of 2
            return;

        var rows = dgv.Rows;
        var nextRow = rows[index + 1];
        rows.Remove(nextRow);
        nextRow.Frozen = false;
        rows.Insert(index, nextRow);
        dgv.ClearSelection();
        dgv.Rows[index + 1].Selected = true;
    }

与Mario代码的不同之处在于我使用(rowCount - 1)而不是(rowCount - 2)......更改后,它完美地运行了。如果在DataGridView中只有2行,则向下移动不起作用...

答案 4 :(得分:0)

这是针对该问题的一个非常小的解决方案:

    private void DataGridView_KeyDown(object sender, KeyEventArgs e)
    {
        //I use only one function for moving with the information
        //e.KeyCode == Keys.Up = move up, else move down
        if (e.KeyCode.Equals(Keys.Up) || e.KeyCode.Equals(Keys.Down))
        {
            MoveUpDown(e.KeyCode == Keys.Up);
        }
        e.Handled = true;
    }

    private void MoveUpDown(bool goUp)
    {
        try
        {
            int currentRowindex = DataGridView.SelectedCells[0].OwningRow.Index;

            //Here I decide to change the row with the parameter
            //True -1 or False +1
            int newRowIndex = currentRowindex + (goUp ? -1 : 1);

            //Here it must be ensured that we remain within the index of the DGV
            if (newRowIndex > -1 && newRowIndex < DataGridView.Rows.Count)
            {
                DataGridView.ClearSelection();
                DataGridView.Rows[newRowIndex].Selected = true;
            }
        }
        catch (Exception)
        {
            MessageBox.Show("Error");
        }

    }

抱歉,我认为我的代码不言自明。 我希望我在评论中明确了我如何处理该问题

答案 5 :(得分:0)

主要问题:

private void MoveUpDown(bool goUp)
    {
        int newRowIndex = DataGridView.SelectedCells[0].OwningRow.Index + (goUp ? -1 : 1);
        if (newRowIndex > -1 && newRowIndex < DataGridView.Rows.Count)
        {
            DataGridView.ClearSelection();
            DataGridView.Rows[newRowIndex].Selected = true;
        }
    }

答案 6 :(得分:0)

    dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;//FullRowSelect
     int selectedrowindexindgv2 =-1;
      private void moveUp()
            {
                if (dataGridView2.RowCount <= 0)
                    return;
    
                if (dataGridView2.SelectedRows.Count <= 0)
                    return;
    
                if (selectedrowindexindgv2 <= 0)
                    return;
    
                DataGridViewRowCollection rows = dataGridView2.Rows;
    
                // remove the previous row and add it behind the selected row.
                DataGridViewRow prevRow = rows[selectedrowindexindgv2 - 1];
                rows.Remove(prevRow);
                prevRow.Frozen = false;
                rows.Insert(selectedrowindexindgv2, prevRow);
                dataGridView2.ClearSelection();
                dataGridView2.Rows[selectedrowindexindgv2 - 1].Selected = true;
                selectedrowindexindgv2 -= 1;
                return;
            }
    
            private void moveDown()
            {
                try
                {
                    if (dataGridView2.RowCount <= 0)
                        return;
    
                    if (dataGridView2.SelectedRows.Count <= 0)
                        return;             
    
                    if (selectedrowindexindgv2 == dataGridView2.Rows.Count - 1) // Here used 1 instead of 2
                        return;
    
                    DataGridViewRowCollection rows = dataGridView2.Rows;
                    // remove the next row and add it in front of the selected row.
                    DataGridViewRow nextRow = rows[selectedrowindexindgv2 + 1];
                    rows.Remove(nextRow);
                    nextRow.Frozen = false;
                    rows.Insert(selectedrowindexindgv2, nextRow);
                    dataGridView2.ClearSelection();
                    dataGridView2.Rows[selectedrowindexindgv2 + 1].Selected = true;
                    selectedrowindexindgv2 += 1;
                }catch(Exception) { }
    
            }
    
       private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                if (dataGridView2.Rows.Count > 0 && e.RowIndex >= 0 && e.ColumnIndex >= 0)
                {
                    try
                    {
                        selectedrowindexindgv2 = e.RowIndex;
    }
  private void pictureBox6Up_Click(object sender, EventArgs e)
        {
            moveUp();
        }

        private void pictureBox7Down_Click(object sender, EventArgs e)
        {
            moveDown();
        }