Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取绑定的复选框的键(id)_C#_Winforms - Fatal编程技术网

C# 如何获取绑定的复选框的键(id)

C# 如何获取绑定的复选框的键(id),c#,winforms,C#,Winforms,我有一个Windows窗体应用程序,还使用SQL从数据库中获取数据。我的Windows窗体应用程序中有一个绑定的检查列表框,我想获取检查列表框中所有选中项的主键(值)。我意识到的是在组合框中,它们有一个内置方法“selectedValue”,我想知道我们是否可以在checkListBox中通过循环checkListBox中的checkedItems来做同样的事情,并获得它的值 假设在我的db表中,我有: EmployeeId Employee Name 1

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

假设在我的db表中,我有:

EmployeeId    Employee Name
1                 Jimmy
2                 Pam
3                 Bob
4                 Kobe
我的活页签列表框显示了如下内容

[x]Jimmy
[x]Pam
[]Bob
[]Kobe
我可以使用sql查询获取checkedItem项的id吗。现在假设Jimmy和Pam被检查了,我想得到他们的雇员ID。我不知道怎么做。我们将不胜感激

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


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

尽管我强烈建议使用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
        }
    }
}
var query=“从EmployeeId位于(@ids)中的employee_表中选择*”;
var id=String.Join(“,”
MyCheckBoxList.Items
.Cast()
.其中(x=>x.Selected)
.选择(x=>x.Value);
使用(var连接=新的SqlConnection(myConnectionString))
{
connection.Open();
使用(var命令=新的SqlCommand(查询、连接)
{
command.Parameters.Add(“ids”,ids);
var reader=command.ExecuteReader();
while(reader.Read())
{
//从读卡器获取所有需要的数据
}
}
}

您不需要再次转到数据库来检索项目的Id

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

public class ItemModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public override string ToString()
    {
        return Name;
    }
}
然后,在加载数据时,您可以选择输出并将其形状设置为
ItemModel
,然后将这些
ItemModel
s添加到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());
}
注意:

如果您使用另一种方法连接到数据库,只需更改此代码即可满足您的要求,例如,此代码使用
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());
}
private void CheckedListBoxSample\u加载(对象发送方,事件参数e)
{
var connection=@“数据源=(localdb)\v11.0;初始目录=TestDB;集成安全性=True;MultipleActiveResultSets=True;”;
var command=“从类别中选择Id、名称”;
var dataAdapter=new System.Data.SqlClient.SqlDataAdapter(命令,连接);
var table=新数据表();
dataAdapter.Fill(表);
var list=table.Rows.Cast()
.选择(行=>new ItemModel
{
Id=行字段(“Id”),
名称=行字段(“名称”)
})
.ToList();
this.checkedListBox1.Items.AddRange(list.Cast().ToArray());
}

你可以发布填充列表框的代码吗?我坚信你已经有了EmployeeID,你不需要对此进行任何查询。只需查看你在复选框中填充的代码,此时你正在同时提取EmployeeID和name。你正在将ID和name绑定到复选框中,并通过选择获得nameedvalue属性。为什么不尝试选择EdItem来获取ID。此外,我觉得,您应该了解流程,而不是跳过编码。因此,请花些时间在纸上了解流程,并熟悉Windows应用程序控件。@DragonBorn我看到您关于此主题的其他问题已经得到了回答。您可以接受我的回答re,因为这是一个很好的答案,适用于您不使用
数据表的时候:)这样,它对其他用户将来会更有用:)@RezaAghaei会的:)嘿,floros,谢谢您的回复。我只是想知道什么是(@ids),它是我数据库中的一列,还是我需要定义它somewhere@DragonBorn它是SqlQuery使用的参数的名称,当
command.Parameters.Add(“ids”,ids)时,它将被替换为数据被调用。有关参数的更多信息,请参阅。它可以帮助您防止SQL注入。
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));
        });
}
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());
}