Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
HomeAnnouncementsFree MagazinesWhite PapersSubmit Content
Discussion GroupsASP.NETWindows FormsLanguages.NET FrameworkVisual Studio.NET
Articles.NET FrameworkASP.NETToolsWindows Forms
.NET DirectoryOpen Source ProjectsUser GroupsWeb Resources
Related Topics
Visual Basic 6SQL ServerMS AccessOther DB ProductsMS Server ProductsMore Topics ...

.NET Forum / Windows Forms / WinForm General / February 2007

Tip: Looking for answers? Try searching our database.

Problem with Nullable( Of Integer) bound to combobox

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Flomo Togba Kwele - 07 Feb 2007 14:39 GMT
I struggled with a problem I had with a combobox bound to a
bindingsource which has as its datasource a collection of custom
objects. The comobobx was bound to a nullable integer property of the
custom object.

When I tried to change the value of the dropdown and tabbed off the
control, the dropdown index would revert back to what it originally
was, so I could not change the value. I placed a breakpoint at the
Leave event of the combobox and single-stepped. It went into the
getter, not the setter!

So I changed the definition of the property in the object bound to the
combobox from Nullable(Of Integer) to Integer and it worked properly.
After the Leave event, it goes into the Setter.

Am I doing something wrong?
Linda Liu [MSFT] - 08 Feb 2007 06:25 GMT
Hi Flomo,

I performed a test based on your description and did see the same thing as
you did.

We could change the value of type Nullable(of Integer) by assigning a value
of type Integer or Nullable(of Integer) to it directly. It seems that the
problem comes from data binding, which in this case doesn't push the new
value to the data source.

I subscribe and handle the Parse event of the Binding object that is added
to the DataBindings property of the ComboBox control, and find that the new
value being pushed to the data source is of type Integer. The following is
the code to subscribe the Parse event of the Binding object and the code of
the event handler.

AddHandler Me.ComboBox1.DataBindings.Item(0).Parse, AddressOf comboboxParse

Private Sub comboboxParse(ByVal sender As Object, ByVal e As
System.Windows.Forms.ConvertEventArgs)
' e.Value is of type Integer.
       Dim obj As Object = e.Value
   End Sub

In the Parse event handler, e.Value is of type Integer. Apparently, data
binding couldn't update the property of type Nullable(Of Integer) with the
value of Integer.

The workaround is simple, i.e. changing the property value by assigning the
new value to it directly in the Parse event handler. The following is a
sample.

Private Sub comboboxParse(ByVal sender As Object, ByVal e As
System.Windows.Forms.ConvertEventArgs)
     ' the obj is a variable refereced to the current object in the data
source
     obj = e.Value
   End Sub

I have performed a test on the above workaround and confirmed it works.

Hope this helps.

If you have any question, please feel free to let me know.

Sincerely,
Linda Liu
Microsoft Online Community Support

==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================

This posting is provided "AS IS" with no warranties, and confers no rights.
Flomo Togba Kwele - 08 Feb 2007 16:29 GMT
Linda,

Thanks for the reply.

In it you said:

>Private Sub comboboxParse(ByVal sender As Object, ByVal e As
>System.Windows.Forms.ConvertEventArgs)
>      ' the obj is a variable refereced to the current object in the data
>source
>      obj = e.Value
>    End Sub

I assumed that by obj you meant sender. If the assumption is correct,
it does not fix the problem.

My code is:

     Dim bndTypeOffset As Binding =
cboTypeOffset.DataBindings.Add("SelectedValue", CampaignBindingSource,
"CampaignDetail.TypeOffset")
     AddHandler bndTypeOffset.Parse, AddressOf ParseTypeOffset

...
  Private Sub ParseTypeOffset(ByVal sender As Object, ByVal e As
ConvertEventArgs)
     sender = e.Value
  End Sub
Linda Liu [MSFT] - 09 Feb 2007 02:30 GMT
Hi Flomo,

Thank you for your prompt response.

The 'obj' in the Parse event handler in my sample code refers to the
current object the data source to which the combobox is bound. In your
scenario, the data source is CampaignBindingSource.

You could get the current object the CampaignBindingSource through its
Current property. Convert the current object to a proper type and then set
'e.Value' to the current object's property which is of type Nullable(Of
Integer).

The following is a sample.

Private Sub ParseTypeOffset(ByVal sender As Object, ByVal e As
ConvertEventArgs)

CType(CampaignBindingSource.Current, YourObjectType).PropertyName = e.Value

End Sub

Hope this helps.
If you have any question, please feel free to let me know.

Sincerely,
Linda Liu
Microsoft Online Community Support
Flomo Togba Kwele - 09 Feb 2007 05:23 GMT
Thanks for the specifics, Linda.

Is it possible for you to send your entire test code to me? It would
be a great help.

Thanks, Flomo

>Hi Flomo,
>
[quoted text clipped - 24 lines]
>Linda Liu
>Microsoft Online Community Support
Linda Liu [MSFT] - 09 Feb 2007 06:57 GMT
Hi Flomo,

The following is the complete code of my test. It requires a ComboBox
control to be added on the form.

Public Class Form1

   Dim myBindingSource As BindingSource

   Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
       ' set up the lookup list
       Dim lookupList As New List(Of Lookup)
       Dim obj As New Lookup
       obj.ID = 1
       obj.Name = "aaaa"
       lookupList.Add(obj)

       obj = New Lookup
       obj.ID = 2
       obj.Name = "bbbb"
       lookupList.Add(obj)

       obj = New Lookup
       obj.ID = 3
       obj.Name = "cccc"
       lookupList.Add(obj)

       Me.ComboBox1.DataSource = lookupList
       Me.ComboBox1.DisplayMember = "Name"
       Me.ComboBox1.ValueMember = "ID"

       ' set up the business list
       Dim businessList As New List(Of Business)
       Dim obj1 As New Business
       obj1.CategoryID = 1
       businessList.Add(obj1)

       obj1 = New Business
       obj1.CategoryID = 2
       businessList.Add(obj1)

       ' set up the BindingSource
       myBindingSource = New BindingSource
       myBindingSource.DataSource = businessList

       ' bind the BindingSource to the ComoboBox control
       Me.ComboBox1.DataBindings.Add("SelectedValue", myBindingSource,
"CategoryID")
       ' subscribe the Parse event of the Binding object
       AddHandler Me.ComboBox1.DataBindings.Item(0).Parse, AddressOf
comboboxParse

   End Sub

   Private Sub comboboxParse(ByVal sender As Object, ByVal e As
System.Windows.Forms.ConvertEventArgs)
       Dim currentobj As Object = myBindingSource.Current
       CType(currentobj, Business).CategoryID = e.Value
   End Sub

End Class

Public Class Lookup
   Private _id As Integer
   Public Property ID() As Integer
       Get
           Return _id
       End Get
       Set(ByVal value As Integer)
           _id = value
       End Set
   End Property

   Private _name As String
   Public Property Name() As String
       Get
           Return _name
       End Get
       Set(ByVal value As String)
           _name = value
       End Set
   End Property
End Class

Class Business
   Private _categoryId As Nullable(Of Integer)
   Public Property CategoryID() As Nullable(Of Integer)
       Get
           Return _categoryId
       End Get
       Set(ByVal value As Nullable(Of Integer))
           _categoryId = value
       End Set
   End Property
End Class

Hope this helps.
If you have any question, please feel free to let me know.

Sincerely,
Linda Liu
Microsoft Online Community Support
Flomo Togba Kwele - 09 Feb 2007 20:56 GMT
Linda,

Thanks for the post.

OK, I see it works. Now to complicate things with real-life issues.

My bindingsource's datasource is a custom collection of custom
objects, which itself contains a custom collection of custom objects -
parent/child.

In the Parse event, I can get to the child collection, but not to the
individual child responsible for raising the event.

As I showed before:

     Dim bndTypeOffset As Binding =
cboTypeOffset.DataBindings.Add("SelectedValue", CampaignBindingSource,
"CampaignDetail.TypeOffset")
     AddHandler bndTypeOffset.Parse, AddressOf ParseTypeOffset

CampaignDetail is the child set, TypeOffset is the property.

I cannot find a way to get to this property in the Parse event,
because the parent exposes the children only as a set, not as
individuals.
Linda Liu [MSFT] - 12 Feb 2007 04:34 GMT
Hi Flomo,

You may try the following code to get the current individual child object
in the Parse event handler:

Dim currentobj As Object = Me.BindingContext.Item(CampaignBindingSource,
"CampaignDetail").Current

If the problem is still not solved, you may send me a sample project that
could just reproduce the problem. To get my actual email address, remove
'online' from my displayed email address.

Sincerely,
Linda Liu
Microsoft Online Community Support

Rate this thread:







Free Magazines

Get these publications absolutely FREE for up to 12 months. There are no hidden fees and no obligation. Simply choose a title, complete the application form and submit it. Read more ...

Oracle MagazineNetwork ComputingComputer WorldBio-IT WorldeWeekInformation WeekInfosecurity
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.