17

我正在开发一个 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 属性。

我在这里错过了什么吗?

4

6 回答 6

16

根据文档,它应该具有此属性... 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 发布
感谢您的反馈,但这是设计使然。我们不支持 CheckedListBox 控件上的数据绑定。这些属性是从它的基类继承的,无法删除,因此我们将它们隐藏在属性网格和 IntelliSense 中。

这就解释了为什么该属性存在,但未在 Intellisense 中显示。

这篇博文也值得一读:http ://waxtadpole.wordpress.com/2009/10/12/assigning-custom-class-to-checkedlistbox-datasource/

于 2011-11-21T17:37:39.003 回答
4

这是我将对象绑定List<T>UserCheckedListBox 的方式。

((ListBox)myCheckedListBox).DataSource = listOfUsers;
((ListBox)myCheckedListBox).DisplayMember = "FullName";
((ListBox)myCheckedListBox).ValueMember = "UserID";

当然不推荐这样做,因为文档告诉我们这个属性是隐藏的。

上面的代码有效,但我注意到 Visual Studio 2012 中的一些副作用,例如:

渲染选中标记的延迟:

单击所需项目后,渲染“已选中”标记会出现烦人的延迟。

就我而言,CheckOnClick属性为真,CausesValidation为假。

于 2014-02-19T17:46:00.363 回答
3

就我个人而言,我使用DataGridView绑定到DataTable具有布尔字段的 a 以及用于显示值的字段。

如果你隐藏列标题和行标题,那么你会得到非常接近 aCheckedListBox给你的东西。

于 2015-05-15T17:55:46.983 回答
2

这可以通过遍历您的潜在数据源并一次添加其项目来解决。例如:

这将导致异常:

myCheckedListBox.DataSource = myStringList;

可以修改成这样:

foreach (string myString in myStringList)
{
    myCheckedListBox.Items.Add(myString);
}
于 2013-09-04T22:49:51.177 回答
1

我知道这已经很老了;为了任何仍然有相同要求的人的利益,这对我有用。请注意,我没有使用DisplayMemberorValueMember属性,因为它似乎不鼓励使用(请参阅上面的@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);
    }
  }
}
于 2014-11-07T19:29:05.050 回答
1

我通过将 ToString () 方法更改为应该出现的名称解决了这个问题:

public static class Fields
{
   public string MyDisplayMenber{ get; set; }

   public override string ToString(){
         return MyDisplayMenber;
   }
}

并变成带有对象的数组列表:

{
  mycheckedlistbox.Items.AddRange(MyList.ToArray<Fields>());
}
于 2016-07-07T06:23:44.013 回答