简体   繁体   English

如何在 KeyUp 或 Keydown 按下时向上/向下移动 gridview 选定的行

[英]How to move gridview selected row up/down on KeyUp or Keydown press

在此处输入图片说明

  1. The user selects one row用户选择一行
  2. there will be up arrow and down arrow.会有向上箭头和向下箭头。
  3. If the user wants to move up, the user clicks up arrow button如果用户想要向上移动,用户点击向上箭头按钮
  4. If the user wants to move down, then the user clicks down arrow button如果用户想向下移动,则用户点击向下箭头按钮
  5. if the row is at the top then up arrow button becomes disabled如果该行位于顶部,则向上箭头按钮将被禁用
  6. if the row is at the bottom then down arrow button becomes disabled如果该行位于底部,则向下箭头按钮将被禁用

i tried this code but not at all working for the above scenario我试过这段代码,但根本不适用于上述情况

private void key_up(object sender, EventArgs e) private void key_up(对象发送者,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;
    }
}

the way to do is , On key_up or button up clicked 1) Get the current selected row index 2) Set the current selected row to (index + 1) as long as the index +1 is less than the row count.这样做的方法是,在 key_up 或按钮上单击 1) 获取当前选定的行索引 2) 只要​​索引 +1 小于行数,就将当前选定的行设置为 (index + 1)。

Do the negation for the key_Down or button down clicked.对 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;
            }
        }
    }

you can see I have separated the move up and down methods, so if you want to use the button clicked events instead of key up and key down event, you can call them when needed.你可以看到我已经分离了向上和向下移动方法,所以如果你想使用按钮点击事件而不是按键向上和按键向下事件,你可以在需要时调用它们。

Cleaned the code of Jegan and made it suitable for multiple datagridviews.清理了 Jegan 的代码,使其适用于多个数据网格视图。

    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;
    }

For me this worked:对我来说这有效:

 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;
    }

The difference to Mario's code is that I used (rowCount - 1) instead of (rowCount - 2) ... After changing this, it worked perfectly.与 Mario 代码的不同之处在于,我使用 (rowCount - 1) 而不是 (rowCount - 2) ...更改后,它运行良好。 Before the move-down didn't work if you only have 2 rows in your DataGridView...如果您的 DataGridView 中只有 2 行,则在向下移动之前不起作用...

If you want to move the selected row up/down as many times as you want, you can use this code to move:如果要根据需要向上/向下移动所选行,可以使用以下代码移动:

Up:向上:

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;
}

Down:下:

 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;
 }

Here is a very small solution for that issue:这是该问题的一个非常小的解决方案:

    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");
        }

    }

Sorry, I thought my code was self-explanatory.抱歉,我以为我的代码是不言自明的。 I hope I made with the comments clear how I proceeded with that issue我希望我的评论清楚地说明了我是如何处理这个问题的

Resumindo mais:简历:

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;
        }
    }
    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();
        }        

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM