2011-07-21 8 views
10

Windows FormsアプリケーションでCheckBoxListを使用していて、データソースを適用しようとしています。列idnameischeckedで、DataTableの 'DT' を有するCheckBoxListでデータソースを使用する

は、私はそのようなコードを使用します。

((ListBox)MyCheckBoxList).DataSource = dt; 
((ListBox)MyCheckBoxList).DisplayMember = "name"; 
((ListBox)MyCheckBoxList).ValueMember = "id"; 

私はMyCheckBoxListのすべての項目のためにcheckStateを設定するにはどうすればよいですか?

私はこの値を自分のデータテーブルに保存し、それらをMyCheckBoxListとリンクしたいと考えています。

+1

= "あなたのブール値"ではなく、 "ValueMember =" id "'である可能性がありますか? – Jay

+0

どうやってこれをやったことがありますか? 'Webページでこれを行うと、 'System.Web.UI.WebControls.CheckBoxList'を 'System.Web.UI.WebControls.ListBox'に変換できません。 – vapcguy

答えて

0

ValueMemberプロパティでチェックを設定する方法が不明です。

あなたはこれに行くを与えることができる:

foreach (DataRow item in dt.Rows) 
{ 
    MyCheckedListBox.Items.Add(item["Name"].ToString(), Convert.ToBoolean(item["Checked"])); 
} 
+1

それは方法ですが、このケースではデータソースを呼び出すことができません – Grinart

6

私は2つのステップで私の問題を決めました。まず、私はデータソースを適用し、円形に次のコードのように各項目のチェックプロパティを設定し、その後別の回避策として

​​
+2

本当にバインド可能なCheckedListBoxはループを必要としません。私たちは何とかListBoxアイテムのIsCheckedプロパティを基になるオブジェクトのプロパティにバインドする必要があります。 – dotNET

1

、Iが自動的に表示CheckedStateを更新するCheckedListBox.Formatイベントを実装しましたデータと; CheckedListBox.ItemCheckイベントを実装して、CheckedStateでデータを自動的に更新します。

private DataTable myDataTable = null; 
private BindingSource myBindingSource = new BindingSource(); 

// Column Name Constants 
private const string C_ITEM_INDEX = "Item_Index";  // CheckedListBox Item's Index 
private const string C_ITEM_TEXT = "Item_Text";  // Item's Text 
private const string C_ITEM_CHECKED = "Item_Checked"; // Item's Checked State 
private const string C_DATA_KEY = "Data_Key";   // Arbitrary Key Value for Relating Item to Other Data 

private void Startup() 
{ 
    // Create DataTable 
    // This DataTable has 4 Columns described by the constants above 
    myDataTable = new DataTable(); 
    myDataTable.Columns.Add(new DataColumn(C_ITEM_INDEX, typeof(Int32))); 
    myDataTable.Columns[C_ITEM_INDEX].DefaultValue = 0; 
    myDataTable.Columns.Add(new DataColumn(C_ITEM_TEXT, typeof(string))); 
    myDataTable.Columns[C_ITEM_TEXT].DefaultValue = ""; 

    // I personally like Integer 1=true, 0=false values. typeof(bool) will also work. 
    myDataTable.Columns.Add(new DataColumn(C_ITEM_CHECKED, typeof(Int32))); 
    myDataTable.Columns[C_ITEM_CHECKED].DefaultValue = 0; 

    // Other columns can be included in the DataTable 
    myDataTable.Columns.Add(new DataColumn(C_DATA_KEY, typeof(Int32))); 
    myDataTable.Columns[C_DATA_KEY].DefaultValue = 0;  
    myDataTable.AcceptChanges(); 

    // Bind the DataTable's DefaultView to the CheckedListBox 
    myBindingSource.DataSource = myDataTable.DefaultView; 
    this.myCheckedListBox.DataSource = myBindingSource; 

    // Set the DisplayMember to the DataColumn you want displayed as the CheckedListBox Items's Text 
    this.myCheckedListBox.DisplayMember = C_ITEM_TEXT; 

    // Set the ValueMember to the Data. Note: The ValueMember is not displayed and is Not the CheckBox value. 
    this.myCheckedListBox.ValueMember = C_DATA_KEY; 

    // Hookup Event Handler for the CheckedListBox.Format Event. 
    /// * The Format event enables us to just in time update the CheckBoxes with the values in the DataTable 
    this.myCheckedListBox.Format += myCheckedListBox_Format; 

    // Hookup Event Handler for the CheckedListBox.ItemCheck Event. 
    /// * The ItemCheck event enables us to just in time update the DataTable with the values from the Item CheckBoxes 
    this.myCheckedListBox.ItemCheck += myCheckedListBox_ItemCheck; 
} 


void myCheckedListBox_Format(object sender, ListControlConvertEventArgs e) 
{ 
    /// * The Format event enables us to just in time update the CheckBoxes with the values in the DataTable 
    // Retrieve the Index of the Item in the CheckedListBox by finding the DataRowView in the BindingSource 
    // Note: Use a column with unique values for the BindingSource.Find() function 
    int listindex = myBindingSource.Find(C_ITEM_INDEX, ((DataRowView)e.ListItem)[C_ITEM_INDEX]); 

    // The argument, e.ListItem, is the current DataRowView in the DataTable's DefaultView 
    // Check to see if the checkbox value is different from the data 
    if (((CheckedListBox)sender).GetItemChecked(listindex) != Convert.ToBoolean(((DataRowView)e.ListItem)[C_ITEM_CHECKED])) 
    { 
    // Set the CheckList Item's CheckState to match the data 
    ((CheckedListBox)sender).SetItemChecked(listindex, Convert.ToBoolean(((DataRowView)e.ListItem)[C_ITEM_CHECKED])); 
    } 
} 


void myCheckedListBox_ItemCheck(object sender, ItemCheckEventArgs e) 
{ 
    /// * The ItemCheck event enables us to just in time update the DataTable with the values from the Item CheckBoxes 
    // Update the data with the new CheckState value. 
    if (e.NewValue == CheckState.Checked) 
    { 
    myDataTable.DefaultView[e.Index][C_ITEM_CHECKED] = 1; 
    } 
    else 
    { 
    myDataTable.DefaultView[e.Index][C_ITEM_CHECKED] = 0; 
    } 
    // Update other data values too if you need to. 
} 
+0

'BindingSource'を使う以外は、' System.Web'にキャリーオーバーしないので、ここではすべてが有効です。両方の領域で使用できるようにコードを汎用的にするために 'System.Windows.Forms'で働く人たちにとっては大変です。しかし私はこのコンセプトが大好きで、間違いなく多くの考えがこれに入りました - 視覚的なフォームのためには非常に機能的です。そうではありません。ウェブアプリケーションのページフォームです。あなたが両方に適応できるなら、私はその結果を見たいと思っています。 – vapcguy

関連する問題