C# 如何在 KeyUp 或 Keydown 按下时向上/向下移动 gridview 选定的行
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16232943/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to move gridview selected row up/down on KeyUp or Keydown press
提问by sanjeev


- The user selects one row
- there will be up arrow and down arrow.
- If the user wants to move up, the user clicks up arrow button
- If the user wants to move down, then the user clicks down arrow button
- if the row is at the top then up arrow button becomes disabled
- 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;
}
}
采纳答案by Jegan
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.
你可以看到我已经分离了向上和向下移动方法,所以如果你想使用按钮点击事件而不是按键向上和按键向下事件,你可以在需要时调用它们。
回答by Kshitij Sharma
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;
}
回答by Mario
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;
}
回答by FranzHuber23
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. Before the move-down didn't work if you only have 2 rows in your DataGridView...
与 Mario 代码的不同之处在于我使用 (rowCount - 1) 而不是 (rowCount - 2) ......更改后,它运行良好。如果您的 DataGridView 中只有 2 行,则在向下移动之前不起作用...
回答by Kevin Br
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
抱歉,我以为我的代码是不言自明的。我希望我的评论清楚地说明了我是如何处理这个问题的
回答by Sérgio Miguel
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;
}
}

