![]() |
Desktop Development »
Smart Client »
General
Intermediate
License: The Code Project Open License (CPOL)
How to Get a Reference to Parent Form from a ComponentBy David CathermanComponents don't have a .Parent property like controls do. Getting a reference to the instance of the parent form the component was on is very difficult. |
VB (VB 7.x, VB 8.0, VB 9.0), Windows, .NET (.NET 2.0, .NET 3.0, .NET 3.5), MobileSQL 2000, VS.NET2003, VS2005, VS2008, DBA, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
I have been working on a custom component that inherits from and extends the BindingSource component (more detailed article in the works). I needed to get a reference to the instance of the parent form the component was on. This proved to be very difficult.
Components don't have a .Parent property like controls do. They do have a container property, but it does not have a parent property either. Sometimes casting the container as a ContainerControl works (it does have a parent property), but in this case it won't cast correctly.
All Windows Designer forms add a container called "components" and all components are added to this container and show at the bottom of the screen in design mode. From inside the component, it is easy to get a reference to the container, but I could not get a reference to the parent form of the container?
I got some useful help from "nobugz" (Hans Passant – Microsoft MVP) on the Windows Form Forum on MSDN who found that the Error Provider component manages to get a reference to the parent form and exposes it in a property called "ContainerControl". The secret the Error Provider uses is to override the Site function of the component and capture IDesignerHost service.
It turns out that the solution is even simpler. All that is needed is to reference the Site property of the base component and get the designer host information from it. Here are the steps to achieve the goal:
Imports System.ComponentModel.Design
…
Private _form As Form
Private Sub GetFormInstance() ' called from constructor
Dim _host As IDesignerHost = Nothing
If MyBase.Site IsNot Nothing Then _host = _
CType(MyBase.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
If _host IsNot Nothing Then _form = CType(_host.RootComponent, Form)
End Sub
.Designer extension). GetFormInstance function. The code should look like this:
<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
MyBase.New()
'This call is required by the Component Designer.
InitializeComponent()
'Added by developer
GetFormInstance()
End Sub
That's it. It is fairly simple once you understand the magic that happens in the ISite service interface that allows applications to interact with the designer (Visual Studio in this case).
| You must Sign In to use this message board. | |||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 19 Oct 2007 Editor: Deeksha Shenoy |
Copyright 2007 by David Catherman Everything else Copyright © CodeProject, 1999-2009 Web21 | Advertise on the Code Project |