在 KeyDown 或 PreviewKeyDown 事件中在 DataGridView 中向上或向下跳转 n 行
Jump n Rows Up or Down in DataGridView on KeyDown or PreviewKeyDown Events
我无法实现 DataGridView 的箭头键导航(未使用数据源)。
DataGridView 有 2 种不同类型的项目,大多数时候每隔一个项目是第一种类型,反之亦然,其他项目是第二种类型。现在,如果有人按下 KeyUp / Down,我希望 DataGridView 跳转到给定索引的一行,而不是向上或向下。
无论我如何尝试解决这个问题,都不清楚活动何时真正结束。如果我在 _previewKeyDown 方法中尝试这个:
if (DgvCarPosAndTrafficMsg.CurrentRow != null)
{
if (e.KeyCode == Keys.Down)
{
if (DgvCarPosAndTrafficMsg.SortOrder == SortOrder.Ascending)
{
for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i < SessionItems.Count; i++)
{
if (SessionItems[i] is CarPosItem)
{
DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
break;
}
}
}
else
{
for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i > 0; i--)
{
if (SessionItems[i] is CarPosItem)
{
DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
break;
}
}
}
}
else if (e.KeyCode == Keys.Up)
{
if (DgvCarPosAndTrafficMsg.SortOrder == SortOrder.Descending)
{
for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i < SessionItems.Count; i++)
{
if (SessionItems[i] is CarPosItem)
{
DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
break;
}
}
}
else
{
for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i > 0; i--)
{
if (SessionItems[i] is CarPosItem)
{
DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
break;
}
}
}
}
它仍然会向上或向下跳 1 行。
我不知道这个事件什么时候被自动处理,我想有我自己的按键事件行为。请帮助我,C# 中的 DataGridViews 及其烦人的事件对我来说很难追踪。似乎这些网格的每个事件的处理方式都不同,对于某些事件,新状态已经应用,对于其他事件(OnSelectionChanged),它会在之后处理。它的记录很差而且不直观,我想避免/覆盖所有这些背景内容。
好的,我找到了一个解决方案,只使用一种事件方法:
这是我的代码,将 evenArgs 设置为已处理很重要,然后执行您自己的网格更新方法:
private void DgvCarPosAndTrafficMsg_KeyDown(object sender, KeyEventArgs e)
{
int diffDown;
int diffUp;
if (DgvCarPosAndTrafficMsg.SortOrder == SortOrder.Descending)
{
diffDown = 1;
diffUp = -2;
}
else
{
diffDown = 2;
diffUp = -1;
}
if (DgvCarPosAndTrafficMsg.CurrentRow != null)
{
if (e.KeyCode == Keys.Down && DgvCarPosAndTrafficMsg.CurrentRow.Index < DgvCarPosAndTrafficMsg.Rows.Count - diffDown)
{
DgvCarPosAndTrafficMsg.CurrentCell = DgvCarPosAndTrafficMsg.Rows[DgvCarPosAndTrafficMsg.CurrentRow.Index + diffDown].Cells[0];
}
else if (e.KeyCode == Keys.Up && DgvCarPosAndTrafficMsg.CurrentRow.Index + diffUp > 0)
{
DgvCarPosAndTrafficMsg.CurrentCell = DgvCarPosAndTrafficMsg.Rows[DgvCarPosAndTrafficMsg.CurrentRow.Index + diffUp].Cells[0];
}
}
e.Handled = true;
DgvCarPosAndTrafficMsg_UpdateAll();
}
我总是跳 up/down 2 行,因为我希望那里有相同类型的项目,但在我的 UpdateAll() 方法中我再次检查它是否正确,并在需要时更正它,否则(如果已经正确)我更新了数据的可视化(并用所选条目的详细信息填充其他网格)。我希望这也会对其他人有所帮助。
你可能对这两个事件都有 -2 和 + 2,我之后会进行一些处理,所以这些值是我需要的索引,根据你的情况调整它或给出一个特定的索引(如问题中所示)
我无法实现 DataGridView 的箭头键导航(未使用数据源)。 DataGridView 有 2 种不同类型的项目,大多数时候每隔一个项目是第一种类型,反之亦然,其他项目是第二种类型。现在,如果有人按下 KeyUp / Down,我希望 DataGridView 跳转到给定索引的一行,而不是向上或向下。
无论我如何尝试解决这个问题,都不清楚活动何时真正结束。如果我在 _previewKeyDown 方法中尝试这个:
if (DgvCarPosAndTrafficMsg.CurrentRow != null)
{
if (e.KeyCode == Keys.Down)
{
if (DgvCarPosAndTrafficMsg.SortOrder == SortOrder.Ascending)
{
for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i < SessionItems.Count; i++)
{
if (SessionItems[i] is CarPosItem)
{
DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
break;
}
}
}
else
{
for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i > 0; i--)
{
if (SessionItems[i] is CarPosItem)
{
DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
break;
}
}
}
}
else if (e.KeyCode == Keys.Up)
{
if (DgvCarPosAndTrafficMsg.SortOrder == SortOrder.Descending)
{
for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i < SessionItems.Count; i++)
{
if (SessionItems[i] is CarPosItem)
{
DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
break;
}
}
}
else
{
for (int i = DgvCarPosAndTrafficMsg.CurrentRow.Index; i > 0; i--)
{
if (SessionItems[i] is CarPosItem)
{
DgvCarPosAndTrafficMsg.Rows[i].Selected = true;
break;
}
}
}
}
它仍然会向上或向下跳 1 行。 我不知道这个事件什么时候被自动处理,我想有我自己的按键事件行为。请帮助我,C# 中的 DataGridViews 及其烦人的事件对我来说很难追踪。似乎这些网格的每个事件的处理方式都不同,对于某些事件,新状态已经应用,对于其他事件(OnSelectionChanged),它会在之后处理。它的记录很差而且不直观,我想避免/覆盖所有这些背景内容。
好的,我找到了一个解决方案,只使用一种事件方法:
这是我的代码,将 evenArgs 设置为已处理很重要,然后执行您自己的网格更新方法:
private void DgvCarPosAndTrafficMsg_KeyDown(object sender, KeyEventArgs e)
{
int diffDown;
int diffUp;
if (DgvCarPosAndTrafficMsg.SortOrder == SortOrder.Descending)
{
diffDown = 1;
diffUp = -2;
}
else
{
diffDown = 2;
diffUp = -1;
}
if (DgvCarPosAndTrafficMsg.CurrentRow != null)
{
if (e.KeyCode == Keys.Down && DgvCarPosAndTrafficMsg.CurrentRow.Index < DgvCarPosAndTrafficMsg.Rows.Count - diffDown)
{
DgvCarPosAndTrafficMsg.CurrentCell = DgvCarPosAndTrafficMsg.Rows[DgvCarPosAndTrafficMsg.CurrentRow.Index + diffDown].Cells[0];
}
else if (e.KeyCode == Keys.Up && DgvCarPosAndTrafficMsg.CurrentRow.Index + diffUp > 0)
{
DgvCarPosAndTrafficMsg.CurrentCell = DgvCarPosAndTrafficMsg.Rows[DgvCarPosAndTrafficMsg.CurrentRow.Index + diffUp].Cells[0];
}
}
e.Handled = true;
DgvCarPosAndTrafficMsg_UpdateAll();
}
我总是跳 up/down 2 行,因为我希望那里有相同类型的项目,但在我的 UpdateAll() 方法中我再次检查它是否正确,并在需要时更正它,否则(如果已经正确)我更新了数据的可视化(并用所选条目的详细信息填充其他网格)。我希望这也会对其他人有所帮助。
你可能对这两个事件都有 -2 和 + 2,我之后会进行一些处理,所以这些值是我需要的索引,根据你的情况调整它或给出一个特定的索引(如问题中所示)