17

私は Winform を開発しており、checkedlistbox が必要です。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 の記事を使用して、この機能が必要な 1 つのプロジェクトでソリューションをコーディングしました。

もう少し調べてみると、次のことがわかりました。

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

オブジェクトを CheckedListBoxList<T>にバインドする方法を次に示します。User

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

もちろん、このプロパティは非表示であるとドキュメントに記載されているため、これはお勧めできません。

上記のコードは機能しますが、Visual Studio 2012 で次のような副作用があることに気付きました。

チェックされたマーカーのレンダリングの遅延:

目的のアイテムをクリックした後、「チェック済み」マーカーをレンダリングするのに煩わしい遅延があります。

私の場合、CheckOnClickプロパティは True、CausesValidationFalse です。

于 2014-02-19T17:46:00.363 に答える
3

個人的には、表示値のフィールドとともにブール フィールドを持つ にDataGridViewバインドされたを使用します。DataTable

列ヘッダーと行ヘッダーを非表示にすると、 a が提供するものにかなり近いものがCheckedListBox得られます。

于 2015-05-15T17:55:46.983 に答える
2

これは、データソースとなるものを繰り返し処理し、その項目を 1 つずつ追加することで回避できます。例えば:

これにより、例外が発生します。

myCheckedListBox.DataSource = myStringList;

これに変更できます:

foreach (string myString in myStringList)
{
    myCheckedListBox.Items.Add(myString);
}
于 2013-09-04T22:49:51.177 に答える
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 に答える
1

これはかなり古いものです。まだ同じ要件を持っている人の利益のために、これが私のために働いたものです. 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);
    }
  }
}
于 2014-11-07T19:29:05.050 に答える