如何将表列(通过SQL查询返回)列为CheckedListBox中的项目?

问题描述 投票:2回答:2

如果我有下表:

 canAssign 
------------
     1       

是否可以将列标题文本(例如canAssign等)添加到CheckedListBox作为用户可以检查的标签?

我找到的所有答案都将value列为标签,如下所示:

☐ 1

代替此:

☐ canAssign

仅作为示例,如果我使用以下内容列出canAssign列中的任何值,如何更改它以列出'canAssign'列标题文本?

string myString = "SELECT canAssign FROM Permissions";
using (SqlConnection myConn = new SqlConnection(globalConnectionString)) 
{
    try {
        myConn.Open();
        using (SqlCommand myComm = new SqlCommand(myString, myConn)) 
        {
            SqlDataReader myReader = myComm.ExecuteReader();
            while (myReader.Read()) {
                checkedListBox1.Items.Add(myReader["canAssign"]);
            }
        }
    } catch (Exception ex) {
        MessageBox.Show(ex.Message);
    }
}

c# winforms sqldatareader checkedlistbox
2个回答
0
投票

在这种情况下,我想您希望在CheckedListBox.Items集合中包含自定义对象,并在CheckedListBox.DisplayMember property中使用CheckedListBox.ValueMember

DisplayMember

获取或设置一个字符串,该字符串指定对象的属性 包含在要显示其内容的列表框中。

ValueMember

获取或设置一个字符串,该字符串指定数据源的属性 从中得出价值。

示例

public class ListBoxItem
{
    public string Text { get; set; }
    public string Value { get; set; }
}

checkedListBox.DisplayMember = "Text";
checkedListBox.ValueMember = "Value";

...create connection and create command logic...
command.CommandText = "SELECT * FROM Permissions";
var reader = command.ExecuteReader();

while (reader.Read()) {

  // of course it would be better to cache that and go straight by indexes
  for(int i = 0; i < reader.FieldCount; i++) {
     var columnName = reader.GetName(i);
     // some logic to humanize values like 'canDownload' to 'Can Download'
     var label = getLabelFor(columnName);
     var value = reader.GetBoolean(i);
     checkedListBox.Items.Insert(0, new ListBoxItem(label , value));
  }
}


0
投票

假定您的代码段中的SQL查询是为了获取特定用户的权限,并使用数据库中相同的字段名称将其显示在CheckedListBox中。

如果听起来不错,请阅读该条目,循环通过SqlDataReader.GetNameSqlDataReader.GetBoolean方法分别获取字段名称和值。

//For example...
var myString = "SELECT * FROM Permissions WHERE UserId = ....";

try
{
    using (SqlConnection myConn = new SqlConnection(globalConnectionString))
    using (SqlCommand myComm = new SqlCommand(myString, myConn))
    {
        myConn.Open();

        using (var myReader = myComm.ExecuteReader())
            if (myReader.Read())
                for (var i = 0; i < myReader.FieldCount; i++)
                    checkedListBox1.Items.Add(myReader.GetName(i), myReader.GetBoolean(i));
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
© www.soinside.com 2019 - 2024. All rights reserved.