Export (0) Print
Expand All

IReferenceService Interface

Provides an interface for obtaining references to objects within a project by name or type, obtaining the name of a specified object, and for locating the parent of a specified object within a designer project.

For a list of all members of this type, see IReferenceService Members.

[Visual Basic]
Public Interface IReferenceService
[C#]
public interface IReferenceService
[C++]
public __gc __interface IReferenceService
[JScript]
public interface IReferenceService

Remarks

The IReferenceService interface provides the following methods:

  • The GetReference method returns the component with the specified name, or a null reference (Nothing in Visual Basic) if no component with the specified name was found.
  • The GetName method returns the name associated with the specified component.
  • The GetComponent method returns the parent container of the specified component.
  • The GetReferences method returns an array of references to all project components, or all project components of an optionally specified type.

Example

[Visual Basic, C#, C++] The following example control uses the GetReferences method of the IReferenceService interface to obtain a list of components in the current design mode project of the type of the currently selected component.

[Visual Basic] 
Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Drawing
Imports System.Data
Imports System.Windows.Forms

Namespace IReferenceServiceExample

    ' This control displays the name and type of the primary selection 
    ' component in design mode, if there is one,
    ' and uses the IReferenceService interface to display the names of 
    ' any components of the type of the primary selected component.    
    ' This control uses the IComponentChangeService to monitor for 
    ' selection changed events.    
    Public Class IReferenceServiceControl
        Inherits System.Windows.Forms.UserControl
        ' Indicates the name of the type of the selected component, or "None selected."
        Private selected_typename As String
        ' Indicates the name of the base type of the selected component, or "None selected."
        Private selected_basetypename As String
        ' Indicates the name of the selected component.
        Private selected_componentname As String
        ' Contains the names of components of the type of the selected 
        ' component in design mode.
        Private typeComponents() As String
        ' Contains the names of components of the base type of the selected component in design mode.
        Private basetypeComponents() As String
        ' Reference to the IComponentChangeService for the current component.
        Private selectionService As ISelectionService

        Public Sub New()
            ' Initializes the control properties.
            Me.BackColor = Color.White
            Me.SetStyle(ControlStyles.ResizeRedraw, True)
            Me.Name = "IReferenceServiceControl"
            Me.Size = New System.Drawing.Size(500, 250)
            ' Initializes the data properties.
            typeComponents = New String(0) {}
            basetypeComponents = New String(0) {}
            selected_typename = "None selected."
            selected_basetypename = "None selected."
            selected_componentname = "None selected."
            selectionService = Nothing
        End Sub

        ' Registers and unregisters design-mode services when 
        ' the component is sited and unsited.
        Public Overrides Property Site() As System.ComponentModel.ISite
            Get
                ' Returns the site for the control.
                Return MyBase.Site
            End Get
            Set(ByVal Value As System.ComponentModel.ISite)
                ' The site is set to null when a component is cut or 
                ' removed from a design-mode site.

                ' If an event handler has already been linked with 
                ' an ISelectionService, remove the handler.
                If Not (selectionService Is Nothing) Then
                    RemoveHandler selectionService.SelectionChanged, AddressOf Me.OnSelectionChanged
                End If

                ' Sites the control.
                MyBase.Site = Value

                ' Obtains an ISelectionService interface to register 
                ' the selection changed event handler with.
                selectionService = CType(Me.GetService(GetType(ISelectionService)), ISelectionService)
                If Not (selectionService Is Nothing) Then
                    AddHandler selectionService.SelectionChanged, AddressOf Me.OnSelectionChanged
                    ' Updates the display for the current selection, if any.
                    DisplayComponentsOfSelectedComponentType()
                End If
            End Set
        End Property

        ' Updates the display according to the primary selected component, 
        ' if any, and the names of design-mode components that the 
        ' IReferenceService returns references for when queried for 
        ' references to components of the primary selected component's 
        ' type and base type.
        Private Sub DisplayComponentsOfSelectedComponentType()
            ' If a component is selected...
            If Not (selectionService.PrimarySelection Is Nothing) Then
                ' Sets the selected type name and selected component name 
                ' to the type and name of the primary selected component.
                selected_typename = selectionService.PrimarySelection.GetType().FullName
                selected_basetypename = selectionService.PrimarySelection.GetType().BaseType.FullName
                selected_componentname = CType(selectionService.PrimarySelection, IComponent).Site.Name

                ' Obtain an IReferenceService and obtain references to 
                ' each component in the design-mode project.
                ' of the selected component's type and base type.
                Dim rs As IReferenceService = CType(Me.GetService(GetType(IReferenceService)), IReferenceService)
                If Not (rs Is Nothing) Then
                    ' Get references to design-mode components of the 
                    ' primary selected component's type.
                    Dim comps As Object() = CType(rs.GetReferences(selectionService.PrimarySelection.GetType()), Object())
                    typeComponents = New String(comps.Length) {}
                    Dim i As Integer
                    For i = 0 To comps.Length - 1
                        typeComponents(i) = CType(comps(i), IComponent).Site.Name
                    Next i
                    ' Get references to design-mode components with a base type 
                    ' of the primary selected component's base type.
                    comps = CType(rs.GetReferences(selectionService.PrimarySelection.GetType().BaseType), Object())
                    basetypeComponents = New String(comps.Length) {}               
                    For i = 0 To comps.Length - 1
                        basetypeComponents(i) = CType(comps(i), IComponent).Site.Name
                    Next i
                End If
            Else
                selected_typename = "None selected."
                selected_basetypename = "None selected."
                selected_componentname = "None selected."
                typeComponents = New String(0) {}
                basetypeComponents = New String(0) {}
            End If
            Me.Refresh()
        End Sub 'DisplayComponentsOfSelectedComponentType

        Private Sub OnSelectionChanged(ByVal sender As Object, ByVal e As EventArgs)
            DisplayComponentsOfSelectedComponentType()
        End Sub 'OnSelectionChanged

        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            e.Graphics.DrawString("IReferenceService Example Control", New Font(FontFamily.GenericMonospace, 9), New SolidBrush(Color.Blue), 5, 5)

            e.Graphics.DrawString("Primary Selected Component from IComponentChangeService:", New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Red), 5, 20)
            e.Graphics.DrawString("Name:      " + selected_componentname, New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Black), 10, 32)
            e.Graphics.DrawString("Type:      " + selected_typename, New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Black), 10, 44)
            e.Graphics.DrawString("Base Type: " + selected_basetypename, New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Black), 10, 56)
            e.Graphics.DrawLine(New Pen(New SolidBrush(Color.Black), 1), 5, 77, Me.Width - 10, 77)

            e.Graphics.DrawString("Components of Type from IReferenceService:", New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Red), 5, 85)
            If selected_typename <> "None selected." Then
                Dim i As Integer
                For i = 0 To typeComponents.Length - 1
                    e.Graphics.DrawString(typeComponents(i), New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Black), 20, 97 + i * 12)
                Next i
            End If
            e.Graphics.DrawString("Components of Base Type from IReferenceService:", New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Red), 5, 109 + typeComponents.Length * 12)
            If selected_typename <> "None selected." Then
                Dim i As Integer
                For i = 0 To basetypeComponents.Length - 1
                    e.Graphics.DrawString(basetypeComponents(i), New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Black), 20, 121 + typeComponents.Length * 12 + i * 12)
                Next i
            End If
        End Sub 'OnPaint

    End Class 'IReferenceServiceControl
End Namespace 'IReferenceServiceExample

[C#] 
using System;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace IReferenceServiceExample
{
    // This control displays the name and type of the primary selection 
    // component in design mode, if there is one,
    // and uses the IReferenceService interface to display the names of 
    // any components of the type of the primary selected component.    
    // This control uses the IComponentChangeService to monitor for 
    // selection changed events.
    public class IReferenceServiceControl : System.Windows.Forms.UserControl
    {
            // Indicates the name of the type of the selected component, or "None selected.".
            private string selected_typename;
            // Indicates the name of the base type of the selected component, or "None selected."
            private string selected_basetypename;
            // Indicates the name of the selected component.
            private string selected_componentname;
            // Contains the names of components of the type of the selected 
            // component in design mode.
            private string[] typeComponents;
            // Contains the names of components of the base type of the selected component in design mode.
            private string[] basetypeComponents;
            // Reference to the IComponentChangeService for the current component.
            private ISelectionService selectionService;
        
            public IReferenceServiceControl()
            {
                // Initializes the control properties.
                this.BackColor = Color.White;
                this.SetStyle(ControlStyles.ResizeRedraw, true);
                this.Name = "IReferenceServiceControl";
                this.Size = new System.Drawing.Size(500, 250);                                    
                // Initializes the data properties.
                typeComponents = new string[0];
                basetypeComponents = new string[0];
                selected_typename = "None selected.";
                selected_basetypename = "None selected.";
                selected_componentname = "None selected.";
                selectionService = null;
            }

            // Registers and unregisters design-mode services when 
            // the component is sited and unsited.
            public override System.ComponentModel.ISite Site
            {
                get
                {
                    // Returns the site for the control.
                    return base.Site;
                }
                set
                {
                    // The site is set to null when a component is cut or 
                    // removed from a design-mode site.

                    // If an event handler has already been linked with 
                    // an ISelectionService, remove the handler.
                    if(selectionService != null)
                        selectionService.SelectionChanged -= new EventHandler(this.OnSelectionChanged);

                    // Sites the control.
                    base.Site = value;
                
                    // Obtains an ISelectionService interface to register 
                    // the selection changed event handler with.
                    selectionService = (ISelectionService)this.GetService(typeof(ISelectionService));
                    if( selectionService!= null )
                    {
                        selectionService.SelectionChanged += new EventHandler(this.OnSelectionChanged);
                        // Updates the display for the current selection, if any.
                        DisplayComponentsOfSelectedComponentType();
                    }
                }
            }

            // Updates the display according to the primary selected component, 
            // if any, and the names of design-mode components that the 
            // IReferenceService returns references for when queried for 
            // references to components of the primary selected component's 
            // type and base type.
            private void DisplayComponentsOfSelectedComponentType()
            {
                // If a component is selected...
                if( selectionService.PrimarySelection != null )
                {              
                    // Sets the selected type name and selected component name to the type and name of the primary selected component.
                    selected_typename = selectionService.PrimarySelection.GetType().FullName;
                    selected_basetypename = selectionService.PrimarySelection.GetType().BaseType.FullName;
                    selected_componentname = ((IComponent)selectionService.PrimarySelection).Site.Name;                

                    // Obtain an IReferenceService and obtain references to 
                    // each component in the design-mode project
                    // of the selected component's type and base type.
                    IReferenceService rs = (IReferenceService)this.GetService(typeof(IReferenceService));
                    if( rs != null )
                    {
                        // Get references to design-mode components of the 
                        // primary selected component's type.
                        object[] comps = (object[])rs.GetReferences( selectionService.PrimarySelection.GetType() );
                        typeComponents = new string[comps.Length];
                        for(int i=0; i<comps.Length; i++)
                            typeComponents[i] = ((IComponent)comps[i]).Site.Name;
   
                        // Get references to design-mode components with a base type 
                        // of the primary selected component's base type.
                        comps = (object[])rs.GetReferences( selectionService.PrimarySelection.GetType().BaseType );
                        basetypeComponents = new string[comps.Length];
                        for(int i=0; i<comps.Length; i++)
                            basetypeComponents[i] = ((IComponent)comps[i]).Site.Name;
                    }
                }
                else
                {
                    selected_typename = "None selected.";
                    selected_basetypename = "None selected.";
                    selected_componentname = "None selected.";
                    typeComponents = new string[0];
                    basetypeComponents = new string[0];
                }
                this.Refresh();
            }

            private void OnSelectionChanged(object sender, EventArgs e)
            {
                DisplayComponentsOfSelectedComponentType();
            }

            protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
            {
                e.Graphics.DrawString("IReferenceService Example Control", new Font(FontFamily.GenericMonospace, 9), new SolidBrush(Color.Blue), 5, 5);

                e.Graphics.DrawString("Primary Selected Component from IComponentChangeService:", new Font(FontFamily.GenericMonospace, 8), new SolidBrush(Color.Red), 5, 20);
                e.Graphics.DrawString("Name:      "+selected_componentname, new Font(FontFamily.GenericMonospace, 8), new SolidBrush(Color.Black), 10, 32);
                e.Graphics.DrawString("Type:      "+selected_typename, new Font(FontFamily.GenericMonospace, 8), new SolidBrush(Color.Black), 10, 44);
                e.Graphics.DrawString("Base Type: "+selected_basetypename, new Font(FontFamily.GenericMonospace, 8), new SolidBrush(Color.Black), 10, 56);
                e.Graphics.DrawLine(new Pen(new SolidBrush(Color.Black), 1), 5, 77, this.Width-5, 77);
            
                e.Graphics.DrawString("Components of Type from IReferenceService:", new Font(FontFamily.GenericMonospace, 8), new SolidBrush(Color.Red), 5, 85);                        
                if( selected_typename != "None selected." )
                    for(int i=0; i<typeComponents.Length; i++)
                        e.Graphics.DrawString(typeComponents[i], new Font(FontFamily.GenericMonospace, 8), new SolidBrush(Color.Black), 20, 97+(i*12));
            
                e.Graphics.DrawString("Components of Base Type from IReferenceService:", new Font(FontFamily.GenericMonospace, 8), new SolidBrush(Color.Red), 5, 109+(typeComponents.Length*12));
                if( selected_typename != "None selected." )
                    for(int i=0; i<basetypeComponents.Length; i++)
                        e.Graphics.DrawString(basetypeComponents[i], new Font(FontFamily.GenericMonospace, 8), new SolidBrush(Color.Black), 20, 121+(typeComponents.Length*12)+(i*12));
            }
    }
}

[C++] 
#using <mscorlib.dll>
#using <System.Windows.Forms.dll>
#using <System.Data.dll>
#using <System.Drawing.dll>
#using <System.dll>
using namespace System;
using namespace System::Collections;
using namespace System::ComponentModel;
using namespace System::ComponentModel::Design;
using namespace System::Drawing;
using namespace System::Data;
using namespace System::Windows::Forms;

// This control displays the name and type of the primary selection 
// component in design mode, if there is one,
// and uses the IReferenceService interface to display the names of 
// any components of the type of the primary selected component.    
// This control uses the IComponentChangeService to monitor for 
// selection changed events.
public __gc class IReferenceServiceControl : public System::Windows::Forms::UserControl
{
    // Indicates the name of the type of the selected component, or "None selected.".
private:
    String* selected_typename;
    // Indicates the name of the base type of the selected component, or "None selected."
    String* selected_basetypename;
    // Indicates the name of the selected component.
    String* selected_componentname;
    // Contains the names of components of the type of the selected 
    // component in design mode.
    String* typeComponents[];
    // Contains the names of components of the base type of the selected component in design mode.
    String* basetypeComponents[];
    // Reference to the IComponentChangeService for the current component.
    ISelectionService* selectionService;

public:
    IReferenceServiceControl()
    {
        // Initializes the control properties.
        this->BackColor = Color::White;
        this->SetStyle(ControlStyles::ResizeRedraw, true);
        this->Name = S"IReferenceServiceControl";
        this->Size = System::Drawing::Size(500, 250);                                    
        // Initializes the data properties.
        typeComponents = new String*[0];
        basetypeComponents = new String*[0];
        selected_typename = S"None selected.";
        selected_basetypename = S"None selected.";
        selected_componentname = S"None selected.";
        selectionService = 0;
    }

    // Registers and unregisters design-mode services when 
    // the component is sited and unsited.
    __property System::ComponentModel::ISite* get_Site()
    {
        // Returns the site for the control.
        return UserControl::get_Site();
    }
    __property void set_Site( System::ComponentModel::ISite* value )
    {
        // The site is set to null when a component is cut or 
        // removed from a design-mode site.

        // If an event handler has already been linked with 
        // an ISelectionService, remove the handler.
        if(selectionService != 0)
            selectionService->SelectionChanged -= new EventHandler(this, &IReferenceServiceControl::OnSelectionChanged);

        // Sites the control.
        UserControl::set_Site( value );

        // Obtains an ISelectionService interface to register 
        // the selection changed event handler with.
        selectionService = dynamic_cast<ISelectionService*>(this->GetService(__typeof(ISelectionService)));
        if( selectionService!= 0 )
        {
            selectionService->SelectionChanged += new EventHandler(this, &IReferenceServiceControl::OnSelectionChanged);
            // Updates the display for the current selection, if any.
            DisplayComponentsOfSelectedComponentType();
        }
    }


    // Updates the display according to the primary selected component, 
    // if any, and the names of design-mode components that the 
    // IReferenceService returns references for when queried for 
    // references to components of the primary selected component's 
    // type and base type.
private:
    void DisplayComponentsOfSelectedComponentType()
    {
        // If a component is selected...
        if( selectionService->PrimarySelection != 0 )
        {              
            // Sets the selected type name and selected component name to the type and name of the primary selected component.
            selected_typename = selectionService->PrimarySelection->GetType()->FullName;
            selected_basetypename = selectionService->PrimarySelection->GetType()->BaseType->FullName;
            selected_componentname = (dynamic_cast<IComponent*>(selectionService->PrimarySelection))->Site->Name;                

            // Obtain an IReferenceService and obtain references to 
            // each component in the design-mode project
            // of the selected component's type and base type.
            IReferenceService* rs = dynamic_cast<IReferenceService*>(this->GetService(__typeof(IReferenceService)));
            if( rs != 0 )
            {
                // Get references to design-mode components of the 
                // primary selected component's type.
                Object* comps[] = (Object*[])rs->GetReferences( selectionService->PrimarySelection->GetType() );
                typeComponents = new String*[comps->Length];
                for(int i=0; i<comps->Length; i++)
                    typeComponents[i] = (dynamic_cast<IComponent*>(comps[i]))->Site->Name;

                // Get references to design-mode components with a base type 
                // of the primary selected component's base type.
                comps = (Object*[])rs->GetReferences( selectionService->PrimarySelection->GetType()->BaseType );
                basetypeComponents = new String*[comps->Length];
                for(int i=0; i<comps->Length; i++)
                    basetypeComponents[i] = (dynamic_cast<IComponent*>(comps[i]))->Site->Name;
            }
        }
        else
        {
            selected_typename = S"None selected.";
            selected_basetypename = S"None selected.";
            selected_componentname = S"None selected.";
            typeComponents = new String*[0];
            basetypeComponents = new String*[0];
        }
        this->Refresh();
    }

    void OnSelectionChanged(Object* /*sender*/, EventArgs* /*e*/)
    {
        DisplayComponentsOfSelectedComponentType();
    }

protected:
    void OnPaint(System::Windows::Forms::PaintEventArgs* e)
    {
        e->Graphics->DrawString(S"IReferenceService Example Control",
            new System::Drawing::Font(FontFamily::GenericMonospace, 9), new SolidBrush(Color::Blue), 5, 5);

        e->Graphics->DrawString(S"Primary Selected Component from IComponentChangeService:",
            new System::Drawing::Font(FontFamily::GenericMonospace, 8),
            new SolidBrush(Color::Red), 5, 20);
        e->Graphics->DrawString(String::Format( S"Name:      {0}", selected_componentname ),
            new System::Drawing::Font(FontFamily::GenericMonospace, 8), new SolidBrush(Color::Black), 10, 32);
        e->Graphics->DrawString(String::Format( S"Type:      {0}", selected_typename ),
            new System::Drawing::Font(FontFamily::GenericMonospace, 8), new SolidBrush(Color::Black), 10, 44);
        e->Graphics->DrawString(String::Format( S"Base Type: {0}", selected_basetypename ),
            new System::Drawing::Font(FontFamily::GenericMonospace, 8), new SolidBrush(Color::Black), 10, 56);
        e->Graphics->DrawLine(new Pen(new SolidBrush(Color::Black), 1), 5, 77, this->Width-5, 77);

        e->Graphics->DrawString(S"Components of Type from IReferenceService:",
            new System::Drawing::Font(FontFamily::GenericMonospace, 8), new SolidBrush(Color::Red), 5, 85);                        
        if( !selected_typename->Equals(S"None selected.") )
            for(int i=0; i<typeComponents->Length; i++)
                e->Graphics->DrawString(typeComponents[i],
                    new System::Drawing::Font(FontFamily::GenericMonospace, 8), new SolidBrush(Color::Black), 20.f, 97.f+(i*12));

        e->Graphics->DrawString(S"Components of Base Type from IReferenceService:",
            new System::Drawing::Font(FontFamily::GenericMonospace, 8), new SolidBrush(Color::Red), 5.f, 109.f+(typeComponents->Length*12));
        if( !selected_typename->Equals(S"None selected.") )
            for(int i=0; i<basetypeComponents->Length; i++)
                e->Graphics->DrawString(basetypeComponents[i],
                    new System::Drawing::Font(FontFamily::GenericMonospace, 8), new SolidBrush(Color::Black), 20.f, 121.f+(typeComponents->Length*12)+(i*12));
    }
};

[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button Language Filter in the upper-left corner of the page.

Requirements

Namespace: System.ComponentModel.Design

Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

Assembly: System (in System.dll)

See Also

IReferenceService Members | System.ComponentModel.Design Namespace

Show:
© 2014 Microsoft