DEWebWorks
asked on
Databinding a Checkbox List
Hi all.
I have an edit form that contains a checkbox list, then has an "other" box below it so users can type in an answer if none of the checkboxes apply. I render the list, and then I need to check the boxes that were in the database. Then I need to fill the "other" box if needed. I can't seem to figure out 2 things. First, I can't change the textbox value in the checkboxlist databound sub. That's the hard part. The other part that baffles me is that my code to check the boxes feels very sloppy. If I try to use something like:
cboCategories.Items.FindBy Value(dbRe ader("cate gory")).Se lected = True
I get a nasty object error. Any ideas?
Here is my code for the databound sub:
I have an edit form that contains a checkbox list, then has an "other" box below it so users can type in an answer if none of the checkboxes apply. I render the list, and then I need to check the boxes that were in the database. Then I need to fill the "other" box if needed. I can't seem to figure out 2 things. First, I can't change the textbox value in the checkboxlist databound sub. That's the hard part. The other part that baffles me is that my code to check the boxes feels very sloppy. If I try to use something like:
cboCategories.Items.FindBy
I get a nasty object error. Any ideas?
Here is my code for the databound sub:
Protected Sub cboCategories_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboCategories.DataBound
If IsNumeric(hfCommunicationID.Value) Then
Dim cboCategoryListItem As ListItem
Dim foundAMatch As Boolean = False
'--- load categories
dbConnection.SPName("sp_Communications")
dbConnection.SPParameter("Action", "SELECTCATEGORIES")
dbConnection.SPParameter("communicationID", hfCommunicationID.Value)
Dim dbReader As SqlDataReader
dbReader = dbConnection.SPExecuteDataReader
While dbReader.Read
For Each cboCategoryListItem In cboCategories.Items
If cboCategoryListItem.Value = dbReader("category") Then
cboCategoryListItem.Selected = True
foundAMatch = True
End If
Next
If Not foundAMatch Then
txtOtherCategory.Text = dbReader("category").ToString
End If
foundAMatch = False
End While
dbConnection.SPCloseDataReader()
End If
End Sub
1. The problemn with the check is what happens if the value is not found? You may need to implement this as two lines:
cboCategories.Items.FindBy Value(dbRe ader("cate gory")).Se lected = True
should perhaps be:
If not isdbnumm(dbReader("categor y")) then
dim chk as ListItem = cboCategories.Items.FindBy Value(dbRe ader("cate gory"))
if chk isnot nothing then chk.Selected = True
End if
2. To implement the code for the "Other" and changing the textbox value in the databound... The problem is probably that you are looping through the datareader adn the value that get's set in the textbox is largely dependant on the dbReader("category") for the very last row in your datareader. I'm not sure about your use of loops there. Doesnt look right.
cboCategories.Items.FindBy
should perhaps be:
If not isdbnumm(dbReader("categor
dim chk as ListItem = cboCategories.Items.FindBy
if chk isnot nothing then chk.Selected = True
End if
2. To implement the code for the "Other" and changing the textbox value in the databound... The problem is probably that you are looping through the datareader adn the value that get's set in the textbox is largely dependant on the dbReader("category") for the very last row in your datareader. I'm not sure about your use of loops there. Doesnt look right.
shouldn't this:
If not isdbnumm(dbReader("categor y")) then
be
If not isdbnull(dbReader("categor y")) then
?
AW
If not isdbnumm(dbReader("categor
be
If not isdbnull(dbReader("categor
?
AW
Arthur_Wood:
Typo...
But yes indeed you are right. Thanks. It is just meant to be a check to make sure that we dont try to access the value if it is null.
Typo...
But yes indeed you are right. Thanks. It is just meant to be a check to make sure that we dont try to access the value if it is null.
ASKER
Sorry, I didn't outline the structure very well. The categories come from a lookup table - no chance of a null.
MlandaT, your solution to problem 1 worked out perfectly! Now I'm just down to why the "other" box won't fill. The basic structure is this. When someone saves the parent record (tblCommunications), first all records are deleted in the tblCommunications_Categori es for that ID (it's a wipe and replace scenario). Then I loop through all checkboxes to save the checked ones. Then if something is in the "Other Category" textbox, I save that. So, upon editing, the dbReader can only have the checked boxes and the value of the extra text box.
This "should" not have anything to do with the order that things are rendered, right?
My code now looks like this:
MlandaT, your solution to problem 1 worked out perfectly! Now I'm just down to why the "other" box won't fill. The basic structure is this. When someone saves the parent record (tblCommunications), first all records are deleted in the tblCommunications_Categori
This "should" not have anything to do with the order that things are rendered, right?
My code now looks like this:
While dbReader.Read
cboCategoryListItem = cboCategories.Items.FindByValue(dbReader("category"))
If cboCategoryListItem IsNot Nothing Then
cboCategoryListItem.Selected = True
cboCategoryListItem = Nothing
Else
txtOtherCategory.Text = dbReader("category").ToString
End If
End While
Let's see the code for saving
ASKER
I've confirmed the data exists in the database.
'--- save categories
Dim cboCategoryListItem As ListItem
For Each cboCategoryListItem In cboCategories.Items
If cboCategoryListItem.Selected Then
dbConnection.SPName("sp_Communications")
dbConnection.SPParameter("Action", "INSERTCATEGORIES")
dbConnection.SPParameter("communicationID", newCommunicationID)
dbConnection.SPParameter("category", cboCategoryListItem.Text)
dbConnection.SPExecuteNonQuery()
dbConnection.SPParameterClear()
End If
Next
'--- pick up "other" category
If txtOtherCategory.Text <> "" Then
dbConnection.SPName("sp_Communications")
dbConnection.SPParameter("Action", "INSERTCATEGORIES")
dbConnection.SPParameter("communicationID", newCommunicationID)
dbConnection.SPParameter("category", txtOtherCategory.Text)
dbConnection.SPExecuteNonQuery()
dbConnection.SPParameterClear()
End If
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Ok, so my partner dug through my 600 lines of code on the page and found where I was resetting the textbox value to "".
Thank you SOOOO much for your help :)
Thank you SOOOO much for your help :)
cboCategories.Items.FindBy
should perhaps be:
If not isdbnumm(dbReader("categor
dim chk as checkbox = cboCategories.Items.FindBy
.Selected = True