如果我有下表:
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);
}
}
在这种情况下,我想您希望在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));
}
}
假定您的代码段中的SQL查询是为了获取特定用户的权限,并使用数据库中相同的字段名称将其显示在CheckedListBox中。
如果听起来不错,请阅读该条目,循环通过SqlDataReader.GetName和SqlDataReader.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);
}