Click here to Skip to main content
Click here to Skip to main content

Bindable CheckedListBox

By , 24 Jul 2006
 

Sample Image - ExCheckedListBox1.jpg

Introduction

It seems that the .NET CheckedListBox even doesn't have primary binding facilities exists in the ListBox and ComboBox, because it must save multiple values in the database. Current article introducing an extended CheckedListBox that has a single property for setting and getting checked items, and also has binding facilities.

Problems

  • .NET CheckedListBox doesn't have binding facilities.
  • Because CheckedListBox works with an object collection it can't be bound to a data source.
  • CheckedListBox doesn't have a property representing whether item checked and it must be changed or getting data with Methods for one item or a collection of checked items hardly .

Needs

  • Creating a public bindable property that representing checked items and sets checked items based on it.
  • It must be one single property that when sets or gets it saves single primitive type value.
  • Items must be loaded from a data source (it could be lookup table) different from Value data source.
  • Because of list controls nature we must bind it to a column.

Using the code

A brief description of how to use the article or code. The class names, the methods and properties, any tricks or tips.

ExCheckedListBox

In the code samples major code belongs to ExCheckedListBox inherited from CheckedListBox of .NET framework.

It's extended CheckedListBox control and has three extra properties:

1. Value property:

This property is type of integer that brings ability to get and set checked item based on one single value. It works with bits in that integer, saves and retrieves values in single column.

get
{
    ///Gets checked items in decimal mode from binary mode
    
    try
    {
        //each item in list has a number that is binary number in decimal mode
        //this number represents that number
        int poweredNumber = 1;
        //loop in all items of list
        for (int i = 0; i < this.Items.Count; i++)
        {
            //if item checked and the value doesn't contains poweredNumber 
            //then add poweredNumber to the value
            if((this.GetItemChecked(i)))
                this.value |= poweredNumber;
            //else if poweredNumber exists in the value remove from it
            else if ((this.value & poweredNumber) != 0)
                this.value -= poweredNumber;

            //raise to the power
            poweredNumber *= 2;
        }
    }
    catch (ArgumentException ex)
    {
        throw ex;
    }
    catch (Exception ex)
    {
        throw ex;
    }


    return this.value;
}
set
{
    ///sets checked items from binary mode converted from decimal value

    this.value = value;
    try
    {
        //each item in list has a number that is binary number in decimal mode
        //this number represents that number
        int poweredNumber = 1;
        //loop in all items of list
        for (int i = 0; i < this.Items.Count; i++)
        {
            //if poweredNumber exists in the value set checked on item
            if ((this.value & poweredNumber) != 0)
                this.SetItemCheckState(i, CheckState.Checked);
            //else remove checked from item
            else
                this.SetItemCheckState(i, CheckState.Unchecked);

            //raise to the power
            poweredNumber *= 2;
        }
    }
    catch (ArgumentException ex)
    {
        throw ex;
    }
    catch (Exception ex)
    {
        throw ex;
    }


}

2. DataSource property:

This property is type of object that brings ability to get and set data source like other collection controls (ListBox and ComboBox). In reality it's base DataSource property used, but it hided in the .NET CheckedListBox because of CheckedListBox logic. So I hide it by new keyword and reused base DataSource protected property.

/// <summary>
/// Gets or sets the data source for this CustomControls.CheckedListBox.
/// Returns:
///    An object that implements the System.Collections.IList or 
//     System.ComponentModel.IListSource
///    interfaces, such as a System.Data.DataSet or an System.Array. The <BR>///    default is null.
///
///Exceptions:
///  System.ArgumentException:
///    The assigned value does not implement the System.Collections.IList or 
//     System.ComponentModel.IListSource
///    interfaces.
/// </summary>
[DefaultValue("")]
[AttributeProvider(typeof(IListSource))]
[RefreshProperties(RefreshProperties.All)]
[Browsable(true)]
public new object DataSource { 
    get 
    {
        return base.DataSource;
    }
    set 
    {
        base.DataSource = value;
        
    }
}

DataSource Property

3. DisplayMember property:

This property is type of string that brings ability to get and set data source specific column like other collection controls (ListBox and ComboBox).

In reality it's base DisplayMember property used, but it hided in the .NET CheckedListBox because of CheckedListBox logic.

So I hide it by new keyword and reused base DisplayMember protected property.

/// <summary>
///   Gets or sets the property to display for this <BR>///   CustomControls.CheckedListBox.
///
/// Returns:
///     A System.String specifying the name of an object property that is <BR>///     contained in the collection specified by the <BR>///     CustomControls.CheckedListBox.DataSource property. The default is <BR>///     an empty string ("").
/// </summary>
[DefaultValue("")]
[TypeConverter("System.Windows.Forms.Design.DataMemberFieldConverter, <BR>System.Design, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
[Editor("System.Windows.Forms.Design.DataMemberFieldEditor, System.Design, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", 
typeof(UITypeEditor))]
[Browsable(true)]
public new string DisplayMember
{
    get
    {
        return base.DisplayMember;
    }
    set
    {
        base.DisplayMember = value;
        
    }
}

Demo Project

Demo project contains a SQL Script that creates two tables:

Products and Cities that have the same scenario of (presented products in specified cities).

Points of Interest

I wanted to implement another scenario (Questions and Answers) In that scenario we must navigate questions and answer the tests with multiple answers but there is a problem with data binding and this scenario.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Hossein Ghahvei Araghi
Program Manager System Group
Iran (Islamic Republic Of) Iran (Islamic Republic Of)
Member
Hossein Ghahvei Araghi
Birth date: 1978
Birth place: Iran
Academic Credentials : BS(Tehran University)
Microsoft Credentials : MCP, MCAD, MCTS 2.0, MCTS 3.5, MCPD 2.0, MCPD 3.5

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Questionhttp://www.codeproject.com/Articles/14916/Bindable-CheckedListBox#_commentsmembermansoorttg28 May '12 - 5:01 
the given link included a windows appilcation,i need same like in web application ,any codeproject avialble
 

Please give me a help
GeneralNew Simple SolutionmemberAlejandro Diaz8 May '08 - 11:20 
Note that even the DataSource, DisplayMember and ValueMember properties don't show up in VS's intellisense, they are there.
......
......
anyDataSet globalDataSet = new anyDataSet();
CheckedListBox myChkListBox = new CheckedListBox();
.....
 
private void fillCheckedListBox()
{
anyDataSetTableAdapters.myTableTableAdapter ta = new anyDataSet TableAdapters.myTableTableAdapter();
ta.Fill(globalDataSet.myTable);
myChkListBox .DataSource = globalDataSet.myTable;
myChkListBox .DisplayMember = "myDisplayMember";
myChkListBox .ValueMember = "myValuMember";
myChkListBox .BindingContext = new BindingContext(); //This is the important part
}
QuestionRe: New Simple SolutionmemberJosé Filipe Néis5 Jun '08 - 8:13 
Alejandro,
 
This solution is much simpler, but I'd like to know somethings from you:
 
1. What's the role of BindingContext in this code?
2. If you set the DataSource after the Display and Value members you also get an inconsistency in the displayed text? I tried with CheckedListBox and the custom one presented in this article, and both have this bug. Using ListBox, though, everything works fine. I tried to find out what's the difference between the implementation of ListBox and CheckedListBox but I counldn't get it. I believe there is some kind of event being raised after the regular code flow.
 
Both questions are important because I wouldn't like to teach my team how to make a "special bind" for one specific control, so, I'd rather create my own full functional control.
 
Thank you in advance.
 
Filipe
GeneralGreat WorkmemberUnRusoDeCaracas1 Apr '08 - 7:35 
Just what I was looking for. Thanks Smile | :)
GeneralAcceptChanges bugmemberRVW28 Feb '08 - 2:16 
In databound mode this listbox appears to reset its Value property to 0 (zero) so all checked items appear unchecked if you call Dataset.AcceptChanges or Datatable.AcceptChanges in either the form's Load event or the form's Shown event.
QuestionCheckListBoxmemberMember 234864126 Jan '08 - 16:21 
Hi
I have CheckListBox In ASP 2005 By VB How I Can Retrieve Selected Data From DataBase
In Data Base I Have Three table
1- School
-School_Code
-School_Desc
 
2-Order
-Order_Code
-Order_Desc
 
3-OrdAndScho
-Order_Code
-School_Desc
 
One School Have One Or More Order
 
I Can insert the Value To The DataBase, But I Can’t Retrieve Please Help Me as soon As Possible
 
Note, I’m using SqlServer Data Base
Thanks
GeneralCheckedListBox does have Datasource, DisplayMember properties.memberVB Prog18 Dec '07 - 9:57 
CheckedListBox does have Datasource, DisplayMember properties.
 
It just doesn't show up in Intellisense.
 
I have used below code and it is working.
 
FieldValuesListBox.DataSource = ds.Tables(0)
FieldValuesListBox.DisplayMember = "Department"
VB Prog

GeneralRe: CheckedListBox does have Datasource, DisplayMember properties.memberAlejandro Rey7 Apr '08 - 11:43 
Thanks! It was very usefull your post! Roll eyes | :rolleyes:
GeneralRe: CheckedListBox does have Datasource, DisplayMember properties.memberSeema Gosain17 Jan '11 - 21:23 
Hi,
Thank you it is very userful
GeneralVery nice, but...membershaybar25 Oct '07 - 6:44 
If you just need the binding related properties, simply cast your CheckedListBox into ListBox. Since CheckedListBox inherits from ListBox, it will work. After the cast set the binding related properties and that's it. You can do all of this in the form load handler.
Of course your solution is more readable (which is great), but it requires sub-classing for a very simple problem.
I wonder why Microsoft have hidden these properties... Confused | :confused:

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web04 | 2.6.130523.1 | Last Updated 24 Jul 2006
Article Copyright 2006 by Hossein Ghahvei Araghi
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid