只需单击一次,即可在同一个ListBox中选择多个ListBox项

时间:2016-04-20 00:08:31

标签: c# winforms listbox

如何通过单击同一ListBox中的项目以编程方式选择ListBox中的其他项?这是一个c#winforms项目。

例如,当我点击下面的衣服时,裤子和衬衫需要自动突出显示。汽车零件也是如此,它将突出轮胎和变速器。

Clothes
Pants
Tires
Shirts
Transmissions
Auto Parts

我将ListBox绑定到DataSource(itemList),并尝试添加" itemIndex"对于我列表中的每个项目,我可以处理排序(我确定可能有更好的方法吗?),这对我来说当时有意义,但我无法弄清楚如何实际制作它在我脑海外工作......

这是我目前的代码。任何建议都很棒。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace listBox_test
{
public partial class Form1 : Form
{
    BindingList<Item> itemList = new BindingList<Item>();

    public Form1()
    {
        InitializeComponent();
        ShowData();
    }
    private void ShowData()
    {
        this.listBox1.DataSource = itemList;
        this.listBox1.DisplayMember = "ItemName";
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        AddItem(itemIndex: 0, itemName: "Clothes", itemPrice: 0.95);
        AddItem(itemIndex: 1, itemName: "Pants", itemPrice: 0.95);
        AddItem(itemIndex: 2, itemName: "Tires", itemPrice: 0.95);
        AddItem(itemIndex: 3, itemName: "Shirts", itemPrice: 0.95);
        AddItem(itemIndex: 4, itemName: "Transmissions", itemPrice: 0.95);
        AddItem(itemIndex: 5, itemName: "Auto Parts", itemPrice: 0.95);
    }

    // Add an item to the list
    private void AddItem(int itemIndex, string itemName, double itemPrice)
    {
        itemList.Add(new Item(itemIndex, itemName, itemPrice));
    }

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // SelectChild(); ??
    }
}
public class Item
{
    public int ItemIndex { get; set; }
    public string ItemName { get; set; }
    public double ItemPrice { get; set; }
    public Item(int itemIndex, string itemName, double itemPrice)
    {
        ItemIndex = itemIndex;
        ItemName = itemName;
        ItemPrice = itemPrice;
    }
}
}

2 个答案:

答案 0 :(得分:1)

您需要在它们之间声明某种关系(可能多个值的一个键),以便您的程序知道哪些项与哪些项相关

例如,以下是使用stringstring[]Dictionary<string, string[]>关系实施的方式:

Dictionary<string, string[]> dict = new Dictionary<string, string[]>(){
    {"Clothes", new string[] {"Pants","Shirts"}},
    {"Auto Parts", new string[] {"Tires","Transmissions"}}
};

然后,将ListBox.SelectionMode设为MultiSimple并基于Keystring),然后您可以选择Value({{ 1}})使用string[]

为了完全实现你想要的东西,我发现它非常棘手 - 特别是如果你使用ListBox.SetSelected事件。至少还有两件事你需要考虑:

  1. 当您在SelectedIndex事件handelr中选择某些内容时,它将导致程序触发另一个 SelectedIndexChanged。如果不小心处理,这可能会因递归调用而导致SelectedIndexChanged异常。
  2. 您可能希望为StackOverflow列表中的项目(例如key)设置一些默认功能。为此,您可能需要记录最后所选项目的内容。 ,遗憾的是,Shirts的{​​{1}}和SelectedItems并未通过选择按时间顺序排列顺序,而是通过顺序订单。因此,您无法推断SelectedIndicesListBox中最后选择的项目是什么,因此您可能需要为最后一个(单数)所选项目实现自己的“记忆”。
  3. 考虑到以上几点,最终的,安全的实现可能看起来像这样(评论):

    SelectedItems

答案 1 :(得分:0)

您需要遍历列表框并将所选内容设置为true

  for (int i = 0; i < myListBox.Items.Count;i++)
   {
       myListBox.SetSelected(i, true);
   }