如何以编程方式在ListView中选择一个项目?


69

我正在尝试以编程方式选择ListView中的第一项,但似乎没有被选择。我正在使用以下代码:

if (listView1.Items.Count > 0)
    listView1.Items[0].Selected = true;

其实我以前遇到过这个问题,但是我不记得我是如何解决的!

Answers:


85

最有可能的,该项目选择的,你就不能说,因为不同的控制具有焦点。您可以通过几种不同的方法来解决此问题,具体取决于应用程序的设计。

  1. 简单的解决方案是在ListView显示表单时将焦点设置为第一个。用户通常通过单击将焦点设置为控件。但是,您也可以指定以编程方式获得焦点的控件。一种方法是将控件的选项卡索引设置为0(最低值表示将具有初始焦点的控件)。第二种可能性是在表单Load事件中或设置Selected属性后立即使用以下代码:

    myListView.Select();
    

    此解决方案的问题在于,当用户将焦点设置为表单上的其他控件(例如文本框或按钮)时,所选项目将不再以突出显示的方式显示。

  2. 要解决此问题,您需要将控件的HideSelection属性设置ListView为False。即使控件失去焦点,这也会导致所选项目保持突出显示

    当控件具有焦点时,所选项目的背景将以系统突出显示颜色绘制。当控制并没有具有焦点,所选项目的背景将用于灰色(或禁用)文本系统颜色画。

    您可以在设计时或通过代码设置此属性:

    myListView.HideSelection = false;
    

41
if (listView1.Items.Count > 0)
{
    listView1.Items[0].Selected = true;
    listView1.Select();
}

除非控件具有焦点(或将HideSelection属性设置为false),否则列表项不会显示为选中状态


4
没有说明的代码段不算作答案。
科迪·格雷

6
但是它回答了问题,并且是自我解释的:-)
VikciaR 2011年

11
不,这不是不言自明的。唯一有意义的方法是,如果您了解除非控件具有焦点(或者将HideSelection属性设置为false),否则列表项不会显示为选中状态。而且,如果您知道这一点,就不必首先提出这个问题。更重要的是,这在用户单击表单上其他位置时中断。突然,所选项目似乎不再被选中!只是从您的答案中复制并粘贴代码的询问者将不知道发生了什么,他们会回来询问另一个问题。
科迪·格雷

1
好的,同意-您的答案更全面,更适合提出问题。
VikciaR 2011年

如果该元素不可见,则必须添加UsersLst.Items[index].EnsureVisible();才能显示该元素。
鲁本·贾昆托

9

我认为问题和解决方案由科迪·格雷(Cody Gray)描述!我还有一点注意。

请检查指定列表视图项(和控件!)的焦点。我可以使用以下代码行设置焦点和选择:

this.listView1.Items[1].Selected = true;
this.listView1.Items[1].Focused = true;

但是集中控制是一个条件!


1
仅当您选择了多个项目时,才需要将焦点设置到单个listview项目。在这种情况下,所有选定项目的背景都将突出显示,但是其中只有一个具有虚线的“焦点矩形”。您可以通过设置Focused属性来确定是哪一个,就像您在此处所做的那样。如果仅ListView选中中的一项,则只要其宿主控件具有焦点,它将始终具有焦点。
Cody Gray

9

我知道这是一个老问题,但是我认为这是绝对的答案。

listViewRamos.Items[i].Focused = true;
listViewRamos.Items[i].Selected = true;
listViewRemos.Items[i].EnsureVisible();

如果控件没有焦点,但是您想将焦点强加给控件,则可以添加以下行。

listViewRamos.Select();

为什么Microsoft不只是添加一种SelectItem()为您完成所有任务的方法,这超出了我的范围。


这是我正在寻找的解决方案。其他解决方案不适用于我。
塞萨尔·哈维尔·门多萨

选择什么类型Item?是ListViewItem吗 如果是,则无法使用来获取属性或方法.
FredM

4
        int i=99;//is what row you want to select and focus
        listViewRamos.FocusedItem = listViewRamos.Items[0];
        listViewRamos.Items[i].Selected = true;
        listViewRamos.Select();
        listViewRamos.EnsureVisible(i);//This is the trick

同意,EnsureVisible()同样重要。
史蒂夫·史密斯

1
if (listView1.Items.Count > 0)
{
    listView1.FocusedItem = listView1.Items[0];
    listView1.Items[0].Selected = true;
    listView1.Select();
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.