为什么检查列表框没有数据源?如何绑定到值列表
本文关键字:列表 绑定 何绑定 检查 为什么 数据源 | 更新日期: 2023-09-27 18:15:23
我正在开发一个Winform,我需要一个复选框。我将值存储在具有List属性的对象中:
public static class Fields
{
public static IList<string> FieldList { get; set; }
static Fields()
{ ...//populate FieldList }
}
现在我希望我的CheckedListBox使用Fields.FieldList作为数据源。在线搜索后,我发现我需要设置
//in myForm_Load
mycheckedListBox.DataSource = Fields.FieldList;
但是 myCheckedListBox 没有 DataSource 属性。
我在这里错过了什么吗?
根据文档,它应该具有此属性... http://msdn.microsoft.com/en-us/library/system.windows.forms.checkedlistbox.datasource(VS.90(.aspx
但是,不久前,我在项目中也遇到了同样的问题,并使用这篇 CodeProject 文章在我需要此功能的一个项目中编写解决方案。
再研究一下,我确实发现了这个:
http://connect.microsoft.com/VisualStudio/feedback/details/115199/checkedlistbox-datasource-displaymember-valuemember-are-hidden
编辑:上面的链接不再有效,但下面的内容来自曾经驻留在那里的文章。
发布者 Microsoft 在 2005/5/30 上午10:28
感谢您的反馈 然而,这是设计使然。我们不支持在 选中列表框控件。这些属性继承自它的基础 类,无法删除,因此我们将它们隐藏在属性网格中,并且 智能感知。
这就解释了为什么该属性存在,但不显示在智能感知中。
这篇博文也值得一读:http://waxtadpole.wordpress.com/2009/10/12/assigning-custom-class-to-checkedlistbox-datasource/
以下是我将User
对象的List<T>
绑定到 CheckedListBox 中的方法。
((ListBox)myCheckedListBox).DataSource = listOfUsers;
((ListBox)myCheckedListBox).DisplayMember = "FullName";
((ListBox)myCheckedListBox).ValueMember = "UserID";
当然不建议这样做,因为文档告诉我们此属性是隐藏的。
上面的代码有效,但我注意到Visual Studio 2012中的一些副作用,例如:
呈现检查标记的延迟:
单击所需项目后,呈现"选中"标记"会有一些烦人的延迟。
就我而言,CheckOnClick
属性为真,CausesValidation
为假。
我个人使用绑定到具有布尔字段和显示值字段的DataTable
的DataGridView
。
如果你隐藏了列标题和行标题,那么你得到的东西非常接近CheckedListBox
给你的东西。
这可以通过循环访问潜在的数据源并一次添加一个项目来解决。例如:
这将导致异常:
myCheckedListBox.DataSource = myStringList;
可以修改为:
foreach (string myString in myStringList)
{
myCheckedListBox.Items.Add(myString);
}
我通过将 ToString (( 方法更改为应该出现的名称来解决问题:
public static class Fields
{
public string MyDisplayMenber{ get; set; }
public override string ToString(){
return MyDisplayMenber;
}
}
并变成带有对象的数组列表:
{
mycheckedlistbox.Items.AddRange(MyList.ToArray<Fields>());
}
我知道这已经很老了;为了任何仍然有相同要求的人的利益,以下是对我有用的方法。请注意,我没有使用DisplayMember
或ValueMember
属性,因为似乎不鼓励这样做(请参阅上面的@David Stratton 的帖子(。
//References
// https://social.msdn.microsoft.com/Forums/vstudio/en-US/0e0da0c9-299e-46d0-b8b0-4ccdda15894c/how-to-assign-values-to-checkedlistbox-items-and-sum-these-values?forum=csharpgeneral
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Windows.Forms;
namespace MyApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
DatabaseProviderFactory factory = new DatabaseProviderFactory();
Database db = factory.Create("MyConnString");
DataTable dt = db.ExecuteDataSet(CommandType.StoredProcedure, "ProcGetCustomers").Tables[0];
var custlist = new List<CheckBoxItem<string, string>>();
for (int i = 0; i < dt.Rows.Count; i++)
{
custlist.Add(Create(dt.Rows[i]["DESC"].ToString(), dt.Rows[i]["CODE"].ToString()));
}
checkedListBox1.Items.AddRange(custlist.Cast<object>().ToArray());
}
public class CheckBoxItem<K, V>
{
public CheckBoxItem(K displayValue, V hiddenValue)
{
DisplayValue = displayValue;
HiddenValue = hiddenValue;
}
public K DisplayValue { get; private set; }
public V HiddenValue { get; private set; }
public override string ToString()
{
return DisplayValue == null ? "" : DisplayValue.ToString();
}
}
public static CheckBoxItem<K, V> Create<K, V>(K displayValue, V hiddenValue)
{
return new CheckBoxItem<K, V>(displayValue, hiddenValue);
}
}
}