【问题标题】:C# Winforms Listview - How can you take programmatic control of the up and down arrow keys on the keyboard?C# Winforms Listview - 如何以编程方式控制键盘上的向上和向下箭头键?
【发布时间】:2014-12-12 20:48:03
【问题描述】:

我已经很久没有使用过winforms了,当我使用时,它是在Visual Basic中。无论如何,我有一个 ListView 控件,我知道这个控件在内部处理键盘上的向上和向下箭头,但我确实需要更多地控制这些键被按下时的行为。

假设我们有一个项目列表 > A、B、C、D、E、F、G

这里的主要问题是有人可以用鼠标突出显示我的 ListView 上的项目列表中的选择。例如,A。如果他们按住鼠标左键并将光标拖到另一个项目(例如,F)并释放,则选择光标所在的项目。不是问题。这会打开一个对话框,他们会做他们的工作,当对话框关闭时,他们会被带回列表,并且他们选择的项目会突出显示(F 仍然突出显示)。再次,不是问题。问题是一旦返回 ListView 他们使用向上或向下箭头键来导航列表。假设他们按了一次向下箭头键。此时,因为他们原来在A上的时候,把鼠标往下拖到F,B就高亮了。因此,即使 F 被正确选择,ListView 仍然认为 A 是最后选择的项目,如果使用向上或向下箭头,它将跳回该选择。

我已经进行了很多研究,并且有各种 sn-ps 代码可以使用 ListView 控件(或其他一些控件或一般的 Form)来执行此操作并捕获键盘按下,但没有什么真正连贯的,至少来自“从头到尾”的例子。有人可以提供一些见解吗?如果您开始讨论委托或创建事件处理程序等,我只要求您详细说明,以便我弄清楚您在说什么。

谢谢!

【问题讨论】:

    标签: c# winforms listview


    【解决方案1】:

    使用 KeyPress 事件。

    ListView Class

    事件处理程序声明

    this.listView1.KeyPress += listView1_keyDown;
    

    在事件处理程序中,您可以执行以下操作:

    private void listView1_KeyDown(object sender, KeyEventArgs e)
    {
         switch (e.KeyCode)
        {
            case Keys.Up:
                 //Change Last Selected Item
                break;
            case Keys.Down:
                break;
            default:
                break;
        }
    }
    

    并添加您需要的附加逻辑。

    还要考虑选中的索引更改事件:

    this.listView1.SelectedIndexChanged
    

    其他想法: 确保禁用多行选择。不确定这是否适用于您,但如果启用此功能,那么您可以选择 A 并正确选择 F,但是 A 将首先显示之后的逻辑。如果您的代码预计选择的项目不超过 1 个,这也可能是原因。

    this.listView1.MultiSelect = false;
    

    【讨论】:

    • 谢谢 Russ...我会看看你的建议,看看是否可行。
    • 这些是我在 ListContentsDialog.Designer.cs 中的 InitializeComponent() 中的以下内容: this.listView1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseUp); this.listView1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseMove); this.listView1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.listView1_MouseDown); this.listView1.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.listView1_KeyPress); OnKeyPress 不可用?
    • JimB 你想要 KeyPress 事件。我的错误我已经更新了我的答案。
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2012-10-06
    • 1970-01-01
    • 2020-11-09
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多