Before I describe the problem, let me give some background on what I'm trying to accomplish because this may not be the best method after all.
THE BACKGROUND:
I have a list of Code / Numeric Value pairs that I want to be able to display in a dual column drop down fashion. The user should be able to type either the single digit code or the actual numeric value in the control and upon exiting the control will always return the corresponding numeric value. The ability to type just the code speeds data entry for users more familiar with the system and the drop down list and ability to type the actual numeric value are for those less familiar.
Next - I need this functionality in a UltraGrid Column that represents the numeric data as well as a stand alone control on a windows form.
To that end I found that using an UltraTextEditor with a RightButton as a DropDown that displayed an UltraGrid bound to the data worked flawlessly on the grid, however some of my filtering & validating was tied to the Parent Grid events.
I was able to then create my own user control that inherits an UltraTextEditor, create an UltraGrid & the DropDown Button in code and bind the grid to the button. Now all the filtering and validation happen on the events inside my user control.
So far - So good.
Next I was able to use an UltraControlContainerEditor to place my user control on the grid column and "wire it up" and this too works perfectly.
THE PROBLEM:
When I try and place my user control on a WinForm - at design time (depending on the various things I have tried thus far) it displays either a single DropDownButton on the Right or none at all; however at Run Time there are TWO DropDownButtons on the right. The innermost one drops/displays the list as expected and the rest of the control works as planned also - there is just a phantom/dummy/extra button on the right of the control I can't get to go away.
Obviously I'm a little over my head here and any input is greatly appreciated.
I am coding with Visual Studio 2012 in VB.net using Infragistics 12.1.20121.2135 CLR4
Here is a sample App that shows problem
https://p2p.aep.com:443/AEPLargeFile/fileDownload.dsp?isEncrypted=true&isEnSet=true&fileStage=30&fileName=L1uhyxfMPhCJil7UKjzBiHZllwIFc1jWUhHJzb2a3dxkbYxO9SBibA%3D%3D&fop=a82b55b0253a11e38bfed34efa60426f8&version=v2
Thanks
Steve
Hi Steve,
I took a quick look at your sample project. You are deriving from UltraTextEditor and your UltraTextEditor control has a DropDownEditorButton in the ButtonsRight collection. This presumably got created the first time you dropped the control on the form. But ButtonsRight is a public collection and gets serialized in the designer.
Forget about your derived control for a moment and imagine that you simply placed a regular UltraTextEditor on a form and added a DropDownEditorButton to the ButtonsRight collection. If you closed the form and re-opened it, that button would still be there - you would not have to add it again every time you opened the form designer.
So, since the button is public, the button that exists in your derived control is getting serialized by the designer. You can see it in the form's InitializeComponent code. Then when you run the application a new instance of your control is created - the constructor gets called and your code in the constructor adds a button to the collection. Then the InitializeComponent code gets called and put the origin button back in, so you end up with two buttons.
What you need is to only add the button when the control is created the first time, not every time a new instance is constructed. So I think if you override the OnCreateControl method and move your code for adding the DropDownEditorButton into that method, it will work.
Protected Overrides Sub OnCreateControl() MyBase.OnCreateControl() If Not Me.DesignMode Then ' Build Drop Down Button & Attach Grid Me.ResetButtonsRight() Dim ddb As New DropDownEditorButton ddb.Control = ug Me.ButtonsRight.Add(ddb) End If End Sub
Mike,
I tried your suggestion first thing this morning (even before coffee LOL) and it seems to be working perfectly. Thank You!!
I have built my own user controls before with "stock" components but I am just now branching out into inheriting / overriding a stock control so I'm learning a lot and finding out there's even more I don't know / understand.
Your explanation made perfect sense and was easy to follow / understand.
Thanks again for your time & help.