【问题标题】:How to get the key(id) of the binded checkListBox如何获取绑定的checkListBox的key(id)
【发布时间】:2015-10-02 20:47:02
【问题描述】:

我有一个 Windows 窗体应用程序,并且还使用 SQL 从我的数据库中获取数据。我在我的 Windows 窗体应用程序中有一个绑定的 checkListBox,我想在我的 checkListBox 中获取 所有选中项 的主键(值)。我意识到在组合框中,他们有一个内置方法'selectedValue'我想知道我们是否可以通过循环检查checkListBox中的checkedItems并获取它的值来在checkListBox中做同样的事情

假设在我的数据库表中,我有:

EmployeeId    Employee Name
1                 Jimmy
2                 Pam
3                 Bob
4                 Kobe

我绑定的 checkListBox 显示类似

[x]Jimmy
[x]Pam
[]Bob
[]Kobe

我可以使用 sql 查询来获取 checkedItem 项的 id。现在假设 Jimmy 和 Pam 已检查,我想获取他们的 employeeId。我不知道该怎么做。我们将不胜感激。

select * from employee_table where employeeId = '"+checkListBox.SelectedValue+"'

foreach(var item = item.CheckedItems{
     select * from employee_table where employeeId = '"items"';
}

【问题讨论】:

  • 你能发布你的代码来填充列表框吗?
  • 我坚信您已经拥有 EmployeeID,您无需为此触发任何查询。只需查看您填写复选框的代码,当时您正在提取 EmployeeID 并命名两者。您将 ID 和名称绑定到 CheckListbox,并且您通过 selectedvalue 属性获取名称。你为什么不试试 SelectedItem 来获取 ID..
  • 另外我觉得,你应该理解流程,而不是跳代码。所以花点时间在纸上理解流程,熟悉Windows应用程序控件。
  • @DragonBorn 我看到你关于这个话题的其他问题已经回答了。您可以在这里接受我的回答,因为对于您不使用DataTable 的时候这是一个很好的回答:) 这样将来它对其他用户会更有用:)
  • @RezaAghaei 会做的:)

标签: c# winforms


【解决方案1】:

您无需再次访问数据库来检索您的项目的 ID。

您可以为包含IdName 属性的项目创建一个类,并覆盖ToString 方法以返回要在CheckedListBox 中显示的字符串:

public class ItemModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
}

然后在加载数据的时候,可以选择输出并将其整形为ItemModel,然后将这些ItemModels添加到CheckedListBox:

private void Form_Load(object sender, EventArgs e)
{
    var db = new TestDBEntities();

    //Select items that you need and shape it to ItemModel
    var list = db.Categories.Select(x => new ItemModel
                    {
                        Id = x.Id,
                        Name = x.Name
                    })
                    .ToList();

    //We cast the list to object[] because AddRange method accept object[]
    this.checkedListBox1.Items.AddRange(list.Cast<object>().ToArray());
}

然后,当您需要知道Id 的选中项时,您可以简单地将每个选中项转换为ItemModel 并使用其Id 属性:

private void button1_Click(object sender, EventArgs e)
{
    this.checkedListBox1.CheckedItems.Cast<ItemModel>()
        .ToList()
        .ForEach(item =>
        {
            MessageBox.Show(string.Format("Id:{0}, Name:{1}", item.Id, item.Name));
        });
}

注意:

如果您使用其他方法连接数据库,您可以简单地更改此代码以满足您的要求,例如此代码使用ADO.Net 对象将数据整形为ItemModel

private void CheckedListBoxSample_Load(object sender, EventArgs e)
{
    var connection = @"data source=(localdb)\v11.0;initial catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;";
    var command = "SELECT Id, Name From Categories";
    var dataAdapter = new System.Data.SqlClient.SqlDataAdapter(command, connection);
    var table = new DataTable();
    dataAdapter.Fill(table);

    var list = table.Rows.Cast<DataRow>()
        .Select(row => new ItemModel
        {
            Id = row.Field<int>("Id"),
            Name = row.Field<string>("Name")
        })
        .ToList();

    this.checkedListBox1.Items.AddRange(list.Cast<object>().ToArray());
}

【讨论】:

    【解决方案2】:

    这些方面的内容可能会对您有所帮助。 基本上它的作用是构建一个参数化查询,然后使用SqlParameters 添加所有选定的项目。然后使用阅读器,您可以解析每个返回的记录。下面的代码可能需要一些修改才能使用它,但应该可以帮助您入门。

    虽然我强烈建议使用像 Entity Framework 这样的 ORM。使用 ORM,您不必构建自己的查询,并允许您使用强类型类与您的数据库“对话”。

    var query = "SELECT * FROM employee_table WHERE imployeeId IN (@ids)";
    var ids = String.Join("," 
                    MyCheckBoxList.Items
                        .Cast<ListItem>()
                        .Where(x => x.Selected)
                        .Select(x => x.Value);
    
    using (var connection = new SqlConnection(myConnectionString))
    {
        connection.Open();
        using(var command = new SqlCommand(query, connection)
        {
            command.Parameters.Add("ids", ids);
            var reader = command.ExecuteReader();
            while(reader.Read())
            {
                //get all the needed data from the reader
            }
        }
    }
    

    【讨论】:

    • 您好弗洛罗斯,感谢您的回复。我只是想知道(@ids)是什么,它是我数据库中的列之一还是我需要在某处定义它
    • @DragonBorn是SqlQuery使用的参数名,在调用command.Parameters.Add("ids", ids);时会被替换为数据。有关参数的更多信息,请参阅this link。它可以帮助您防止 SQL 注入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多