【问题标题】:Keys.Down acts differently from other arrow keys?Keys.Down 与其他箭头键的作用不同?
【发布时间】:2012-04-09 00:23:17
【问题描述】:

我创建了一个 listView,当用户单击一个元素并按下向上或向下箭头键时,该元素应该移动到那里并且该元素应该保持选中状态。它非常适合向上箭头键,但是当我在“case Keys.Down”开关下粘贴相同的代码时,只有 listView 中的 TOP 元素保持选中状态。这很奇怪!我还在 Keys.Left 和 Keys.Right 开关下粘贴了相同的代码,并且代码在那里完美运行,但是一旦我将开关更改为 Keys.Down,只有顶部元素保持选中状态。有谁知道为什么会发生这种情况?

【问题讨论】:

  • 贴出相关部分代码。
  • 是的,请发布代码,对我来说,这听起来像你没有正确地打破开关盒。
  • 请使用{}按钮正确格式化代码..
  • 不要复制粘贴所有代码,如果所有 4 个案例都使用相同的代码,那么您可以 case Keys.Up: case Keys.Down: case Keys.Left: case Keys.Right: { ... }
  • 代码实际上不应该是相同的。我这样做只是为了弄清楚问题发生的原因。我现在看到,如果我只是将案例从 Keys.Up 更改为 Keys.Down,它会出现错误,我不知道这会如何发生或解决它的方法。

标签: c# listview scroll


【解决方案1】:

在向下的情况下偏移量应该不同。您使用相同的( -1 )。在向下它应该是 +1 像这样:

newSpot = listOrderNames.IndexOf(listView.SelectedItems[0].Text) + 1;
index = listOrderNames.IndexOf(listView.SelectedItems[0].Text) + 1;

另外,你可以把它写得更简洁

int offset = 0;
case Keys.Up:
    offset = -1; 
    break;
case Keys.Down:
    offset = 1;
    break;
if (listView.SelectedItems.Count > 0) 
{
    int newSpot = 0;
    int index = 0;
    if (listOrderNames.IndexOf(listView.SelectedItems[0].Text) == 0) 
    {
        reorder(0, true);
        newSpot = listOrderNames.Count + offset;
    }
    else 
    {
        newSpot = listOrderNames.IndexOf(listView.SelectedItems[0].Text) + offset;
        index = listOrderNames.IndexOf(listView.SelectedItems[0].Text) + offset;
        swap(listOrderNames.IndexOf(listView.SelectedItems[0].Text), newSpot);
    }
    for (int i = 0; i < listView.Items.Count; i++) 
    {
        listView.Items[i].Selected = false;
    }
    listView.Items[newSpot].Selected = true;
}

【讨论】:

  • 谢谢,但这并不能解决我的问题。当按下向下错误时,最后的循环取消选择所有 listView 项和它之后的行仍然不会发生。
  • 基本上,如果我按下向下箭头并试图找出原因,那么在 switch 事件中或下发布的相同代码的工作方式会有所不同
  • 你的意思是事件永远不会触发?那是一个与你上面提到的问题不同的问题,但这是错误的事情。
猜你喜欢
  • 2016-09-21
  • 2020-09-16
  • 2015-02-16
  • 2023-03-15
  • 1970-01-01
  • 2020-11-21
  • 2014-08-29
  • 2012-04-11
  • 2015-04-28
相关资源
最近更新 更多