在C#中,如何从复选框中向列表对象添加元素?

6

我相信之前已经有人问过这个问题,但是我可能没有用正确的术语进行搜索,因为我似乎找不到我要找的内容。

我有一个名为“Packages”的类:

class Packages
{
    string PackageID {get; set;}
    string PackageName { get; set; }
}

我有一个上下文中的包列表。
public class TransferJobContext
{
    public string ImportFile;
    public string WorkSheetName;
    public DataSet TransferData;
    public List<Packages> Packages = new List<Packages>();
}

我在表单上有一个CheckedListBox控件,它绑定了一个数据源。以下是我将值加载到CheckedListBox中的代码段:

using (var connection = my_DB.GetConnection())
{
    try
    {
        connection.Open();
        SqlDataReader rdr = null;
        dt = new DataTable();
        string CommandText = "SELECT ID, Name FROM TABLENAME WHERE UPPER(Import_File_Source) LIKE '%abc%' and STATUS = 1";

        SqlCommand cmd = new System.Data.SqlClient.SqlCommand(CommandText, connection);

        rdr = cmd.ExecuteReader();
        dt.Load(rdr);
        cbPackages.DataSource = dt;
        cbPackages.ValueMember = "ID";
        cbPackages.DisplayMember = "Name";

    }
    catch (Exception E)
    {
        MessageBox.Show(E.Message.ToString());
    }
    connection.Close();
}

当用户选中选定项目的值成员和显示成员时,如何将新包添加到列表中? 编辑:好吧,也许我完全错了。而不是告诉您我已经做了什么,我会告诉您我想发生什么。
我向用户展示一个带有复选框的已检查列表框,其中列出了名称列表。他们可以选择多个。这导致我有一个或多个ID可用于查询和一个或多个名称可用作描述。我需要传递我的上下文中的一个或多个id / name组合的“Package”。
捕获用户所选内容的ID /名称组合并将其传递到我的上下文中的最佳方法是什么?

1
Winforms?Web forms?Mvc? - Mike Perrenoud
@TheSolution 我标记了WinForms,因为使用了CheckedListBox。 - CodingIntrigue
Leslie,你是否考虑使用属性(properties)而不是公共成员(public members)? - Moo-Juice
1
你能展示一下如何将数据绑定到CheckedListBox吗?它没有值和显示成员。 - Sergey Berezovskiy
当我查看对象属性时,它显示为CheckedListBox,但是当我运行表单时,我得到的不是ComboBox,而是一个带有复选框的列表。 - Leslie
显示剩余3条评论
1个回答

1

第一步:从数据库中获取现有的包:

public function GetPackages() as List<Package>
{
 using (var connection = my_DB.GetConnection())
    {
        try
        {
            connection.Open();
            SqlDataReader rdr = null;
            dt = new DataTable();
            string CommandText = "SELECT ID, Name FROM TABLENAME WHERE UPPER(Import_File_Source) LIKE '%abc%' and STATUS = 1";

            SqlCommand cmd = new System.Data.SqlClient.SqlCommand(CommandText, connection);

             var packages = new List<Package>();
             using(var reader = cmd.ExecuteReader())
             {
             do while(reader.Read())
               {
               packages.Add(new Package({ID = reader.GetString(0), Name = reader.GetString(1)})
               }
             }

            cbPackages.DataSource = packages;
            cbPackages.ValueMember = "ID";
            cbPackages.DisplayMember = "Name";
            return packages;
        }
        catch (Exception E)
        {
            MessageBox.Show(E.Message.ToString());
            return new List<Package>();
        }
        connection.Close();
    }

}

第二步:将获取的软件包分配给您上下文实例:
yourContext.Packages = GetPackages();

第三步:使用您的软件包填充CheckedListBox:

cbPackages.DataSource = yourContext.Packages;
cbPackages.ValueMember = "ID";
cbPackages.DisplayMember = "Name";

最后:用户输入后,获取选中的包并对其进行任何想要的操作:

foreach (Package  item in checkedListBox1.CheckedItems)
{
     MessageBox.Show(Package.ID);
     MessageBox.Show(Package.Name);
     //do whatever you want here e.g. pass it back to the context
}
旁注: 我建议您将Packages重命名为Package,将PackageID重命名为ID,将PackageName重命名为Name(如示例代码中已经提出的那样)。

我到底什么时候将List分配给我的checkedlistbox控件了?我不认为我做过这样的事情吧? - Leslie
@Leslie 还展示了如何相应地设置数据源。 ;) - Fabian Bigler
看起来你正在创建一个新列表 - 我的上下文中已经有了这个列表,我不想创建一个新列表。而且我也不想将所有ID /名称组合添加到列表中,我只想添加他们选择的那些。 - Leslie
@Leslie 我稍微修改了我的回答。希望现在对你有所帮助。如果没有,如果您能发布有关如何处理TransferJobContext的更多代码,我将非常高兴。 - Fabian Bigler
对于回复的延迟,我深感抱歉。感谢您的帮助,但我不希望我的上下文中包含所有的软件包组合,只需要选定的那些。我会尝试修改您所展示的内容以实现这一目标。 - Leslie
@Leslie 不用担心。如果你有任何进一步的问题,请告诉我。 - Fabian Bigler

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