• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 655
  • Last Modified:

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.FindByValue(dbReader("category")).Selected = True

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

Open in new window

0
DEWebWorks
Asked:
DEWebWorks
  • 5
  • 3
1 Solution
 
MlandaTCommented:
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.FindByValue(dbReader("category")).Selected = True

should perhaps be:

If not isdbnumm(dbReader("category")) then

      dim chk as checkbox = cboCategories.Items.FindByValue(dbReader("category"))
.Selected = True
0
 
MlandaTCommented:
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.FindByValue(dbReader("category")).Selected = True

should perhaps be:

If not isdbnumm(dbReader("category")) then

      dim chk as ListItem = cboCategories.Items.FindByValue(dbReader("category"))
      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.
0
 
Arthur_WoodCommented:
shouldn't this:

If not isdbnumm(dbReader("category")) then

be

If not isdbnull(dbReader("category")) then

?

AW
0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
MlandaTCommented:
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.
0
 
DEWebWorksAuthor Commented:
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_Categories 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:

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

Open in new window

0
 
MlandaTCommented:
Let's see the code for saving
0
 
DEWebWorksAuthor Commented:
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

Open in new window

0
 
MlandaTCommented:
Looks to me like all your code should work. However, since we are inserting the 'Other' value into the same table as the rest of the categories... when the combobox binds again the next time... there is nothin there to distinguish the 'Other' value from the rest of them.
0
 
DEWebWorksAuthor Commented:
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 :)
0

Featured Post

Easily manage email signatures in Office 365

Managing email signatures in Office 365 can be a challenging task if you don't have the right tool. CodeTwo Email Signatures for Office 365 will help you implement a unified email signature look, no matter what email client is used by users. Test it for free!

  • 5
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now