我尝试了这段代码,但根本没有为上述场景工作
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;
}
}
答案 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();
}