【问题标题】:C# adding to list object from checkboxC#从复选框添加到列表对象
【发布时间】:2013-08-02 11:08:53
【问题描述】:

我确信以前有人问过这个问题,但我没有在寻找正确的术语或其他什么,因为我似乎无法找到我正在寻找的东西。

我有一个课程包:

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 组合。

捕获用户所做选择的 ID/名称组合并将它们传递到我的上下文中的最佳方法是什么?

【问题讨论】:

  • Winforms?网络表格? MVC?
  • @TheSolution 我标记了 winforms 由于使用 CheckedListBox
  • 是的 Winforms,抱歉我忘记添加了 - C# 的新手 :)
  • Leslie,你有没有考虑过使用属性而不是公共成员?
  • 您能展示如何将数据绑定到 CheckedListBox 吗?它没有价值和显示成员

标签: c# winforms list


【解决方案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";

最后:用户输入后,获取checkedpackages,然后对它们做任何你想做的事:

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 重命名为 PackagePackageID 重命名为 IDPackageName 重命名为 Name(正如示例代码中已经提出的那样) .

【讨论】:

  • 我什么时候将 List 分配给我的 checklistbox 控件?我不认为我做过这样的事??
  • @Leslie 还展示了如何相应地设置数据源。 ;)
  • 看起来您正在创建一个新列表 - 我的上下文中已经有该列表,我不想创建一个新列表。而且我不想将所有 ID/姓名组合添加到列表中,我只想添加他们选择的那些
  • @Leslie 我稍微改变了我的答案。希望它现在对你有更好的帮助。如果没有,我会很高兴你能发布更多关于你如何处理你的 TransferJobContext 的代码。
  • 对于延迟回复此问题,我深表歉意。感谢您的帮助,但我不希望我的上下文包含所有的包组合,只有选定的包组合。我会看看我是否可以修改你展示的内容来实现这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多