如何以编程方式选择 ListView 中的项目?

Posted

技术标签:

【中文标题】如何以编程方式选择 ListView 中的项目?【英文标题】:How to select an item in a ListView programmatically? 【发布时间】:2011-08-13 01:41:46 【问题描述】:

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

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

其实我以前也遇到过这个问题,但是我不记得我是怎么解决的了!

【问题讨论】:

【参考方案1】:
if (listView1.Items.Count > 0)

    listView1.Items[0].Selected = true;
    listView1.Select();

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

【讨论】:

没有解释的代码 sn-ps 不算作答案。 但它回答了问题并且不言自明:-) 不,这不是不言自明的。唯一有意义的方法是,如果您了解列表项不会显示为选中,除非控件具有焦点(或者您将 HideSelection 属性设置为 false)。如果你知道这一点,你一开始就不必问这个问题。更重要的是,当用户单击表单上的其他位置时,这会中断。突然,所选项目似乎不再被选中!只是从您的答案中复制和粘贴代码的提问者不会知道发生了什么,他们会回来问另一个问题。 好的,同意 - 您的回答更全面,更适合问题。 如果该元素不可见,您必须添加UsersLst.Items[index].EnsureVisible(); 才能显示该元素。【参考方案2】:

最有可能的是,项目 被选中,您只是无法判断,因为不同的控件具有焦点。有几种不同的方法可以解决这个问题,具体取决于应用程序的设计。

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

    myListView.Select();
    

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

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

    当控件拥有焦点时,被选中项的背景将被涂上系统高亮颜色。当控件没有获得焦点时,所选项目的背景将被绘制为用于灰色(或禁用)文本的系统颜色。

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

    myListView.HideSelection = false;
    

【讨论】:

【参考方案3】:

我认为问题和解决方案是由 cody gray 描述的!我还有一条注释。

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

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

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

【讨论】:

仅当您选择了 多个 项时,才需要将焦点设置到单个列表视图项。在这种情况下,所有选定项目的背景都将突出显示,但其中只有一个具有虚线“焦点矩形”。您可以通过设置Focused property 来确定是哪一个,就像您在此处所做的那样。当只选择ListView 中的一项时,只要其宿主控件获得焦点,它就会始终获得焦点。【参考方案4】:
if (listView1.Items.Count > 0)

    listView1.FocusedItem = listView1.Items[0];
    listView1.Items[0].Selected = true;
    listView1.Select();

【讨论】:

【参考方案5】:
        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() 同样重要。【参考方案6】:
ListViewItem.IsSelected = true;
ListViewItem.Focus();

【讨论】:

【参考方案7】:

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

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

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

listViewRamos.Select();

为什么微软不只是添加一个 SelectItem() 方法来为你完成这一切,我无法理解。

【讨论】:

这是我正在寻找的解决方案。其他解决方案对我不起作用。 选中的Item是什么类型的?是ListViewItem吗?如果是,我无法使用. 获取属性或方法。

以上是关于如何以编程方式选择 ListView 中的项目?的主要内容,如果未能解决你的问题,请参考以下文章

ListView 以编程方式突出显示单行或多行

WPF ListView - 如何以编程方式添加项目?

如何以编程方式选择 WPF TreeView 中的项目?

ListView:如何从外部以编程方式访问 Item 的元素?

以编程方式滚动到 Android ListView 中的特定位置

如何以编程方式选择collectionview中的项目?