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の記事 を使用して、この機能が必要な1つのプロジェクトでソリューションをコーディングしました。
もう少し調べてみると、私はこれを見つけました:
編集:上記のリンクは機能しなくなりましたが、以下の抜粋はかつてそこにあった記事からのものです。
2005年5月30日午前10時28分にMicrosoftによって投稿されました
フィードバックをありがとうございますが、これは仕様によるものです。 CheckedListBoxコントロールでのデータバインディングはサポートされていません。これらのプロパティは基本クラスから継承され、削除できないため、プロパティグリッドとIntelliSenseから非表示にしました。
これは、プロパティが存在する理由を説明していますが、Intellisenseには表示されません。
このブログ投稿も読む価値があります: 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 Studio2012には次のようないくつかの副作用があります。
チェックされたマーカーのレンダリングの遅延:
目的のアイテムをクリックした後、「チェック済み」マーカーをレンダリングするのに煩わしい遅延があります。
私の場合、CheckOnClick
プロパティはTrue、CausesValidation
はFalseです。
個人的には、表示値のフィールドとともにブールフィールドを持つDataGridView
にバインドされたDataTable
を使用します。
列ヘッダーと行ヘッダーを非表示にすると、CheckedListBox
が提供するものにかなり近いものが得られます。
これは、データソースを繰り返し処理し、そのアイテムを一度に1つずつ追加することで回避できます。例えば:
これにより、例外が発生します。
myCheckedListBox.DataSource = myStringList;
これに変更できます:
foreach (string myString in myStringList)
{
myCheckedListBox.Items.Add(myString);
}
私はこれがかなり古いことを知っています。まだ同じ要件を持っている人のために、これが私のために働いたものです。 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);
}
}
}
ToString()メソッドを表示される名前に変更することで問題を解決しました。
public static class Fields
{
public string MyDisplayMenber{ get; set; }
public override string ToString(){
return MyDisplayMenber;
}
}
オブジェクトを含む配列リストに変換します。
{
mycheckedlistbox.Items.AddRange(MyList.ToArray<Fields>());
}