0

提前道歉,我可能很难说清楚。我已经搜索过了,但讨论对我来说太复杂了,我刚刚开始使用 C#。

项目:C# WindowsForm / .NET 4.5 / Visual Studio 2012

挑战:我想将列表框中的项目添加到另一个列表框(我可以使用列表和 foreach 循环轻松完成),并根据列表框 2 中的选择使最终列表框显示特定项目。

说明:所选项目将合并我在另一个列表框中创建的组,因此如果我在列表框 1 中选择少数项目,我会将它们发送到列表框 3,但它们仅应在我选择列表框 2 中的特定项目时出现。

想象一下从列表中选择游戏,将其添加到新列表中的“Nintendo”组中,这样当在 listbox2 中选择 Sega 时,它们就不会与 Sega 混合。

我可以在所有列表框中添加值,将我想要的从 1 复制到 3,但我不知道如何使选择尊重 2 上的选择。

我已经阅读了有关数据绑定等的内容,但是给出的示例太复杂了(并且可能存在一些语言障碍),是否有资源可以为一个非常小的项目提供最简单的解决方案?

请用外行术语开导一个傻瓜,好吗?

谢谢

编辑:你(无论你是谁)都对我的问题投反对票。很公平。你至少可以告诉我问题是什么,或者问题在哪里得到解答,这样我就可以解决我的问题。那不是很好吗?我是 C# 的初学者,所以第一个问题看起来很荒谬/懒惰是很自然的......

4

3 回答 3

1

数据绑定将是要走的路。要关注的主要组件是BindingSource。您还可以调查底层数据的DataSet,因为它们可以为您提供一些过滤的灵活性。但是,如果这是一个小型应用程序,并且您只是在学习,那么下面的示例可能是一个好的开始:

BindingSource每个列表框的 a 拖到表单上。然后,将 ListBox 的每个DataSource属性连接到相应的BindingSource.

下面是一个示例代码,它显示了如何将底层数据绑定到每个BindingSources已经绑定到列表框的数据:

namespace WindowsFormsApplication1
{
    public class Game
    {
        public string Name { get; set; }
        public string Group { get; set; }
    }

    public class Group
    {
        public string Description { get; set; }
    }

    public partial class Form1 : Form
    {
        List<Game> _allGames;

        public Form1()
        {
            InitializeComponent();

            _allGames = new List<Game>
            {
                new Game { Name = "Alpha", Group = "" },
                new Game { Name = "Bravo", Group = "One" },
                new Game { Name = "Charlie" , Group = "One"},
                new Game { Name = "Delta", Group = "Two" }
            };

            bindingSource1.DataSource = _allGames;
            listBox1.DisplayMember = "Name";
            listBox1.ValueMember = "Name";

            var groups = new List<Group>
            {
                new Group { Description = "One" },
                new Group { Description = "Two" },
                new Group { Description = "Three" }
            };

            bindingSource2.DataSource = groups;
            listBox2.DisplayMember = "Description";
            listBox2.ValueMember = "Description";
        }

        private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            var group = listBox2.SelectedValue.ToString();
            bindingSource3.DataSource = _allGames.Where(x => x.Group == group);
            listBox3.DisplayMember = "Name";
        }
    }
}

这段代码所做的只是将数据绑定到 BindingSource 并告诉每个 ListBox 显示底层数据的哪个属性。此示例忽略了将 listBox1 中的每个项目分配给 listBox2 中的组的机制,因为我假设您知道如何执行此操作或可以弄清楚这一点。

listBox2 更改时的事件处理程序只获取所做的选择,并从 listBox1 创建与该项目匹配的项目列表,然后在 listBox3 中显示这些项目。

于 2013-07-09T12:45:10.827 回答
1

为了简单起见,我们假设绑定到列表框的项目是字符串。然后你可以使用字典来保存你的小组作业(你必须把它保存在某个地方):

Dictionary<string, List<string>> listOfGroups = new Dictionary<string, List<string>>();

其中 key 是组的名称,字符串列表包含组中的项目。然后,在某个地方,您创建一个组,您将为其分配值

void CreateGroup(string groupName)
{
     listBox2.Items.Add(groupName);
     if (!listOfGroups.ContainsKey(groupName)
                listOfGroups.Add(groupName, new List<string>());
}

然后,您可以在组中管理项目并在例如 listBox2 上的选择更改时添加/删除它们:

string item = (string)listBox1.SelectedItem;

if(!listOfGroups.ContainsKey((string)listBox2.SelectedItem))
    listOfGroups.Add((string)listBox2.SelectedItem,new List<string>());
((List<string>)listOfGroups[(string)listBox2.SelectedItem]).Add(item);

listBox3.Items.Add(item);
listBox1.Items.Remove(item);

最后:

private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
    listBox3.Items.Clear();
    if (!listOfGroups.ContainsKey((string)listBox2.SelectedItem))
        listOfGroups.Add((string)listBox2.SelectedItem, new List<string>());

    listBox3.Items.AddRange(listOfGroups[(string)listBox2.SelectedItem].ToArray());

    List<string> list = listOfAllItems.Where(a => !listBox3.Items.Contains(a)).ToList();
    listBox1.Items.Clear();
    listBox1.Items.AddRange(list.ToArray());
}

不过,这只是一个想法。如果您使用的是 DataSet,也许您可​​以只使用 linq(而不是字典)来选择要在 listbox2 更改后显示的项目。

于 2013-07-09T12:39:52.423 回答
0

您可以保存某种字典,键是第一个列表框中的元素,值是第二个列表框的项目。

于 2013-07-09T12:01:27.990 回答