【问题标题】:Add items to a ListBox and bind them to an item in another Listbox将项目添加到 ListBox 并将它们绑定到另一个 Listbox 中的项目
【发布时间】:2013-07-07 00:29:49
【问题描述】:

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

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

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

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

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

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

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

请用外行的术语来开导一个傻瓜吗?

谢谢

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

【问题讨论】:

  • 您的问题应该用一个示例来描述,其中所有 3 个列表框都指定了您希望它们成为的某些项目。

标签: c# winforms binding listbox dataset


【解决方案1】:

Databinding将是去的方式。专注于关注的主要成分是BindingSource。您还可以调查DataSets为您的基础数据进行@,因为它们会给您带来一些灵活性filtering。但是,如果这是一个小型应用程序,并且您只是在学习,那么下面的示例可能是一个好的开始:

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

这是一个示例代码,显示了如何将底层数据绑定到BindingSources又绑定到listboxes:

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";
        }
    }
}

所有此代码正在进行绑定到绑定源,并告诉每个列表框以显示底层数据的属性。此示例忽略了从ListBox2中将每个项目分配给列表中的组的机制,因为我假设您知道如何做到这一点或者可以弄清楚。

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

【讨论】:

  • 我仍然有很多学习......我知道这不会容易,但是,我甚至无法完全理解这段代码。我需要搞得更多。 span>
【解决方案2】:

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

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 更改后显示的项目。

【讨论】:

  • 再次,这里有很多知识,我没有资格识别解决我的问题的最有效的方法(我不得不求助于其他更简单的方法)。从现在开始我会回到这个问题,并将最适合我的问题的答案标记为首选答案。
【解决方案3】:

你可以保存某种字典,key是第一个ListBox的元素,value是第二个ListBox的item。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多