从listView中只选择一个项目

3

我是c#的初学者。当用户选择在ComboBox中显示的项名称时,我需要仅显示ListView(及其子项)中的一项。

我知道要使用的事件即为SelectedIndexChanged事件,但我不知道该怎么做。

目前我正在使用替代的复杂过程,其中包括XML文件和数据集,这使我的项目变得更加复杂。

ListView中有许多项。相同的项名称也在ComboBox中。

如果您有时间,请查看我的非常小的项目。下载

编辑:这里 "仅显示一个项" 严格意义上是指仅显示一个项,而不是选择特定项并显示所有项。


如果您只想从组合框中选择一个选项,为什么列表视图中有这么多项目呢?另外,展示一些代码可能会有帮助。 - LightStriker
当用户从组合框中进行选择时,卸载 ListView,并以已有的方式重新加载 - 但要进行限制。例如:"如果 item.Name == comboBox.SelectedItem.ToString()"(伪代码)。 - John Arlen
2个回答

5

为什么不使用这段代码来获得所需的结果:

添加:

按照以下步骤进行:

  1. Create a Country class as follows:

    class Country
    {
        public string Name { get; set; }
        public string Flag { get; set; }
        public string Continent { get; set; }
        public string Capital { get; set; }
        public string Population { get; set; }
        public string Currency { get; set; }
    }
    
  2. Populate the countries information as per your requirement, as shown below:

    List<Country> countryList = new List<Country>() { 
        new Country() { Name = "India", Capital = "Delhi", Continent = "Asia", Currency = "Rupee", Population = "1.2 Billion", Flag = "india.gif" }, 
        new Country() { Name = "Pakistan", Capital = "Islamabad", Continent = "Asia", Currency = "Rupee", Population = "0,5 Billion", Flag = "pakistan.gif" }, 
        new Country() { Name = "Sri Lanka", Capital = "Kotte", Continent = "Asia", Currency = "SriLankan Rupee", Population = "20277597", Flag = "sri_lanka.gif" } 
    };
    
  3. Modify *frmFlag_Load* event as shown below:

    private void frmFlag_Load(object sender, EventArgs e)
    {
        lvMain.Items.Clear();
        tlstrpcmbCountries.Items.Clear();
    
        tlstrpcmbCountries.Items.Add("All");
        for (int i = 0; i < countryList.Count; i++)
        {
            tlstrpcmbCountries.Items.Add(countryList[i].Name);
        }
    
        tlstrpcmbCountries.SelectedIndex = 0;
        tlstrpcmbViews.SelectedIndex = 0;
    }
    
  4. Modify the SelectedIndexChanged event of your ComboBox and ListView as shown below:

    private void tlstrpcmbCountries_SelectedIndexChanged(object sender, EventArgs e)
    {
        var country = countryList.Where(c => c.Name.Equals(tlstrpcmbCountries.SelectedItem.ToString())).Select(s => s).FirstOrDefault();
    
        if (country != null)
        {
            lvMain.Items.Clear();
    
            ListViewItem item = new ListViewItem(country.Name, country.Flag);
    
            item.SubItems.Add(country.Continent);
            item.SubItems.Add(country.Capital);
            item.SubItems.Add(country.Population);
            item.SubItems.Add(country.Currency);
            lvMain.Items.Add(item);
    
            lvMain.EnsureVisible(0);
            item.Selected = true;
            item.Focused = true;
            lvMain.Select();
        }
    }
    
    private void lvMain_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (lvMain.SelectedItems.Count > 0)
        {
            var selected = lvMain.SelectedItems[0];
            lblCountryName.Text = selected.SubItems[0].Text;
            lblContinent.Text = selected.SubItems[1].Text;
            lblCapitalCity.Text = selected.SubItems[2].Text;
            lblPopulation.Text = selected.SubItems[3].Text;
            lblCurrencyName.Text = selected.SubItems[4].Text;
        }
    }
    
通过遵循这种方法,您甚至不需要匹配您的项的顺序。
编码愉快...

是的,它在我的端上完美地运行。唯一的问题是项目没有按照我在答案中提到的顺序排列。检查正确的事件处理程序。我将ListView_Click事件处理程序更改为ListView_SelectedIndexChanged。确保在您的端上这是正确的。 - Furqan Safdar
我已经更正了订单...但它仍然只是选择特定的项目并显示所有项目:(。我在我的代码中也没有进行任何编辑。你能给我那个工作项目吗? - Mr_Green
它不应该选择该项。它应该显示唯一的项目并隐藏其他项目(或删除它或执行其他操作)。如果我的问题不清楚,那我很抱歉。请编辑我的问题,使其更易理解(我在英语方面有些困难)... 如果您愿意的话。 - Mr_Green
2
有这么多的专业支持,我期望得到一点点赞赏。 - Furqan Safdar
很多方面都有,但不是针对这个问题的 :( 这就是为什么我只是点了赞。请查看我的答案。 - Mr_Green
显示剩余5条评论

0

经过多次尝试,我最终决定使用DataSetDataTable,因为我们需要保存对列表视图项所做的更改,并且这些更改应该保存在DataSetDataTable中,以便稍后可以调用这些项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接