C# 使用上下箭头键获取列表视图中关注的项目

C# 使用上下箭头键获取列表视图中关注的项目,c#,listview,selecteditem,keydown,keyup,C#,Listview,Selecteditem,Keydown,Keyup,我希望从listview中获取所选项目,但不是通过单击它,因为我已经有了一个函数来实现这一点。我想用我的上下箭头来做这件事 我已经有了一个方法,但它抛出了一个异常,有人能帮助重构这个吗?以下是方法 private void lvViewFile_KeyDown(object sender, KeyEventArgs e) { ListView lvTemp = (ListView)sender; if (e.KeyCode == Keys.Up) { if

我希望从listview中获取所选项目,但不是通过单击它,因为我已经有了一个函数来实现这一点。我想用我的上下箭头来做这件事

我已经有了一个方法,但它抛出了一个异常,有人能帮助重构这个吗?以下是方法

private void lvViewFile_KeyDown(object sender, KeyEventArgs e)
{
    ListView lvTemp = (ListView)sender;
    if (e.KeyCode == Keys.Up)
    {
        if (lvTemp.Focused == true)
        {
            var selected = this.lvCategory.SelectedItems[0].Focused;
        }
    }
    else if (e.KeyCode == Keys.Down)
    {
        if (lvTemp.Focused == true)
        {
            var selected = this.lvCategory.SelectedItems[0].Focused;
        }
    }
}

这似乎正是我想要的

if (e.KeyCode == Keys.Up)
            {
                if (lvTemp.Focused == true)
                {
                    var selected = lvTemp.FocusedItem.Index;
                    if (selected.Equals(0))
                    {
                        enableMoveDown();
                    }
                    else if (selected.Equals(lvCategory.Items.Count - 1))
                    {
                        enableMoveUp();
                    }
                    else
                    {
                        enableMoveUpMoveDown();
                    }
                }
            }
            else if (e.KeyCode == Keys.Down)
            {
                if (lvTemp.Focused == true)
                {
                    var selected = lvTemp.FocusedItem.Index;
                    if (selected.Equals(0))
                    {
                        enableMoveDown();
                    }
                    else if (selected.Equals(lvCategory.Items.Count - 1))
                    {
                        enableMoveUp();
                    }
                    else
                    {
                        enableMoveUpMoveDown();
                    }
                }
            }

这似乎正是我想要的

if (e.KeyCode == Keys.Up)
            {
                if (lvTemp.Focused == true)
                {
                    var selected = lvTemp.FocusedItem.Index;
                    if (selected.Equals(0))
                    {
                        enableMoveDown();
                    }
                    else if (selected.Equals(lvCategory.Items.Count - 1))
                    {
                        enableMoveUp();
                    }
                    else
                    {
                        enableMoveUpMoveDown();
                    }
                }
            }
            else if (e.KeyCode == Keys.Down)
            {
                if (lvTemp.Focused == true)
                {
                    var selected = lvTemp.FocusedItem.Index;
                    if (selected.Equals(0))
                    {
                        enableMoveDown();
                    }
                    else if (selected.Equals(lvCategory.Items.Count - 1))
                    {
                        enableMoveUp();
                    }
                    else
                    {
                        enableMoveUpMoveDown();
                    }
                }
            }

这是一篇老文章,但我修改了接受的答案,以便在使用箭头键浏览ListView时显示数据库中的数据。这可能对其他人有帮助:

ListView lv = sender as ListView;
if (lv.Focused) // which it should be as the user is running arrow keys on it!
{
    int selected = lv.FocusedItem.Index; // gets the index of the CURRENT ListViewItem (Not the one you see highlighted after arrow key movement)
    switch (e.KeyCode) // Can use if/else here if preferred
    {
        case Keys.Up:
            //Change index to the row above the current one
            selected--;
            if(selected < 0) //check if already on the first row
            {
                selected = 0;
            }
            break;
        case Keys.Down:
            //Change index to the row below the current one
            selected++;
            if(selected > lv.Items.Count - 1) //check if index out of range
            {
                selected = lv.Items.Count - 1;
            }
            break;
    }
    // Carry out your choice of action. (This one reads a database and fills fields)
    FillFields(lvClients.Items[selected].SubItems[0].Text);
}
ListView lv=发送方作为ListView;
if(lv.Focused)//当用户在它上面运行箭头键时,它应该是哪个!
{
int selected=lv.FocusedItem.Index;//获取当前ListViewItem的索引(不是在箭头键移动后突出显示的索引)
开关(e.KeyCode)//如果愿意,可以在此处使用if/else
{
案例密钥。向上:
//将索引更改为当前索引上方的行
选定--;
if(selected<0)//检查是否已在第一行
{
所选=0;
}
打破
案例键。向下:
//将索引更改为当前索引下的行
选定++;
if(selected>lv.Items.Count-1)//检查索引是否超出范围
{
所选=lv.Items.Count-1;
}
打破
}
//执行您选择的操作。(此操作读取数据库并填充字段)
填充字段(lvClients.Items[selected]。子项[0]。文本);
}

这是一篇老文章,但我修改了接受的答案,以便在使用箭头键浏览列表视图时显示数据库中的数据。这可能对其他人有帮助:

ListView lv = sender as ListView;
if (lv.Focused) // which it should be as the user is running arrow keys on it!
{
    int selected = lv.FocusedItem.Index; // gets the index of the CURRENT ListViewItem (Not the one you see highlighted after arrow key movement)
    switch (e.KeyCode) // Can use if/else here if preferred
    {
        case Keys.Up:
            //Change index to the row above the current one
            selected--;
            if(selected < 0) //check if already on the first row
            {
                selected = 0;
            }
            break;
        case Keys.Down:
            //Change index to the row below the current one
            selected++;
            if(selected > lv.Items.Count - 1) //check if index out of range
            {
                selected = lv.Items.Count - 1;
            }
            break;
    }
    // Carry out your choice of action. (This one reads a database and fills fields)
    FillFields(lvClients.Items[selected].SubItems[0].Text);
}
ListView lv=发送方作为ListView;
if(lv.Focused)//当用户在它上面运行箭头键时,它应该是哪个!
{
int selected=lv.FocusedItem.Index;//获取当前ListViewItem的索引(不是在箭头键移动后突出显示的索引)
开关(e.KeyCode)//如果愿意,可以在此处使用if/else
{
案例密钥。向上:
//将索引更改为当前索引上方的行
选定--;
if(selected<0)//检查是否已在第一行
{
所选=0;
}
打破
案例键。向下:
//将索引更改为当前索引下的行
选定++;
if(selected>lv.Items.Count-1)//检查索引是否超出范围
{
所选=lv.Items.Count-1;
}
打破
}
//执行您选择的操作。(此操作读取数据库并填充字段)
填充字段(lvClients.Items[selected]。子项[0]。文本);
}

您在哪一行收到什么类型的异常<代码>NullReferenceException在此行
var selected=this.lvCategory.SelectedItems[0]。聚焦?我已经编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。在哪一行,你会得到什么类型的例外<代码>NullReferenceException
在此行
var selected=this.lvCategory.SelectedItems[0]。聚焦?我已经编辑了你的标题。请参阅“”,其中的共识是“不,他们不应该”。