Link to home
Start Free TrialLog in
Avatar of Dhanin
Dhanin

asked on

Multiple Checkbox value in a table field and how to sepearte the value and check the respective checkboxes (.NET 2, C#)

Hi,
       I have a form (.NET 2, C#) and cusine types are in Checkboxes. This cusine type is a static one.
There are 10 cusine types (Thai, Western, Indian, Itally etc.,) all are displayed in checkbox for the user to select more than one cusine type.

Though it's static thing, I would like to store this info in a single field in table. How do I store this info (concatenate when the user submits), then how to display it. i.e seperate string and check the respective checkboxes (cusine type) in the edit mode.

Could anyone help me how to retrieve and concatenate before updating to table field and also when retreval from a field how to seperate and select the respective checkbox.

Thank you.
Avatar of cheddar73
cheddar73

Not pretty, but it should work.  Maybe someone else has a better solution.

using System.Text;

StringBuilder sb = new StringBuilder;

if (chkThai.Checked == true)
{
    sb.Append("1");
}
else
{
    sb.Append("0");
}

if (chkWestern.Checked == true)
{
    sb.Append("1");
}
else
{
    sb.Append("0");
}

// Save this string in the table
string values = sb.ToString();

// Then when you want to retrieve the values:

if (values.Substring(0, 1) == "1")
{
    chkThai.Checked = true;
}
else
{
    chkThai.Checked = false;
}

if (values.Substring(1, 1) == "1")
{
    chkWestern.Checked = true;
}
else
{
    chkWestern.Checked = false;
}
One other note:  I did it the way I did it above because you asked how to store the values as a string.  A more efficient way to store a set of values this way would be as a bitmask using the BitVector32 structure.  You can then store the data from all the check boxes on the form in a 32-bit integer, instead of a 10-byte string.  Let me knowif you're interested and I'll post an example.
Avatar of Dirk Haest
--> concatenate the selected fields into 1 string with a specified delimiter.
        private void button3_Click(object sender, EventArgs e)
        {
            StringBuilder s = new StringBuilder();
            if (checkedListBox1.CheckedItems.Count != 0)
            {
                // If so, loop through all checked items and print results.
               
                for (int x = 0; x <= checkedListBox1.CheckedItems.Count - 1; x++)
                {
                    s.Append (checkedListBox1.CheckedItems[x].ToString() + ";");
                }
                s.Length = s.Length - 1;
            }
            MessageBox.Show(s.ToString());
        }

--> Select the items in the listbox, depending of the value in the database
        private void button4_Click(object sender, EventArgs e)
        {
            string strFromDb ="English;Fastfood";

            char[] splitter = { ';' };

            string[] arSelected = strFromDb.Split(splitter);

            for (int x = 0; x < arSelected.Length; x++)
            {
                for (int i = 0; i <= checkedListBox1.Items.Count - 1; i++)
                {
                    if (arSelected[x].ToString() == checkedListBox1.Items[i].ToString())
                        checkedListBox1.SetItemChecked(i, true);
                }

            }

        }
u may record the checkbox values into hidden value, the read it from code behind
e.g.
<form id="form1" runat="Server" onsubmit="recordValue();" method="post">
<div id="chk">
<input type="checkbox" id="chk1" value="test1" />
<input type="checkbox" id="chk2" value="test2" />
<input type="checkbox" id="chk3" value="test3" />
<input type="checkbox" id="chk4" value="test4" />
<input type="hidden" id="hid1" runat="server" />
</div>
</form>

<script>
function recordValue()
{
    objDiv = document.getElementById("chk");
    objChks = objDiv.getElementsByTagName("INPUT");
    objHid = document.getElementById("hid1");
    for (i=0; i < objChks.length; i++)
    {
         if (objChks[i].type == "checkbox")
         {
                 if (objChks[i].checked)
                 {
                       objHid.value += objChks[i].value + ",";
                 }
         }
    }
}
</script>


from your code behind
.......void button1_click(..............)
{
string strValues = Hidden1.value;
}

it's just a quick idea for recording the values, HTH :o)
OK, there are 2 ways to do this, one is simple but expensive, the other is not that simple but economic.
1- Do it using Integers where you can AND and OR them to get what you want. I am talking about binary bitwise AND and OR. How this goes:
Use CheckBoxList for this and set the values for the items to the appropriate integers. For example:
first item in the list of checkboxes has the value 1, second 2, third 4, fourth 8, 16, 32, ... and so on. This is Binary of 00000001, 00000010, 00000100, 00001000, ... and so on.
How this helps is by ORing them, so if you selected both the first and the second the result will be 00000001 | 00000010 = 00000011, the syntax for this is:
int item1 = 1;
int item2 = 2;
int orResult = item1 | item2;

now this gives us 1 integer holding all the selections.
to know IF a checkbox is selected we can do this:
for example if we want to know if the third checkbox is checked :
if((orResult & 00000100) != 0)
//do something
When we use the & operator which is binary &, we can check if the third 00000100 checkbox is selected by anding that value with the resulting number (that we will get from the Database).

2 - The second more expensive way is to concatenate strings:
checkbox1 has a value = 'Thai', checkbox2 has value 'French' concatenation is something like:
"Thai" + "|" + "French" = "Thai|French"
to separate them we can split them into a string array:
string[] aSelections = sConcatenated.Split("|");
for loop on the array and we are done.

Enjoy...
Is it a checked ListBox or individual CheckBoxes on the form?
CheckBoxList Control lets you specify the value for each ListItem.
Right, but I got the impression it was individual CheckBoxes, which makes iterating through them a little more complicated.  If it's a CheckedListBox, you can iterate the ListBox's Items collection.  If they are inidividual CheckBoxes, you need to get each one by name.
It is easier to use the CheckBoxList unless you have some javascrpt to bind to each individual checkbox.
OK, I'll pile on.  Here's how you would do this using a BitVector32 to create a singe 32-bit integer with all your values.

using System.Collections.Specialized;

            BitVector32 bv = new BitVector32(0);
            int thai = BitVector32.CreateMask();
            int western = BitVector32.CreateMask(thai);
            int indian = BitVector32.CreateMask(indian);
            int italian = BitVector32.CreateMask(italian);

            bv[thai] = chkThai.Checked;
            bv[western] = chkWestern.Checked;
            bv[indian] = chkIndian.Checked;
            bv[italian] = chkItalian.Checked;

            // This is the integer you would save to the table
            int cuisineData = bv.Data;


            // Then when you want to retrieve the values:
            int thai = BitVector32.CreateMask();
            int western = BitVector32.CreateMask(thai);
            int indian = BitVector32.CreateMask(indian);
            int italian = BitVector32.CreateMask(italian);

            // cuisineData is the integer you retrieved from the database
            BitVector32 bv = new BitVector32(cuisineData);

            chkThai.Checked = (bool)bv[thai];
            chkWestern.Checked = (bool)bv[western];
            chkIndian.Checked = (bool)bv[indian];
            chkItalian.Checked = (bool)bv[italian];
ASKER CERTIFIED SOLUTION
Avatar of cheddar73
cheddar73

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial