IReferenceService 接口

定义

提供的接口用于:按名称或类型获取对项目内对象的引用、获取指定对象的名称、在设计器项目内定位指定对象的父对象。

public interface class IReferenceService
public interface IReferenceService
type IReferenceService = interface
Public Interface IReferenceService

示例

以下示例控件使用 GetReferences 接口的 IReferenceService 方法获取当前设计模式项目中当前所选组件类型的组件列表。

#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 ref class IReferenceServiceControl: public System::Windows::Forms::UserControl
{
private:

   // Indicates the name of the type of the selected component, or "None selected.".
   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.
   array<String^>^typeComponents;

   // Contains the names of components of the base type of the selected component in design mode.
   array<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 = "IReferenceServiceControl";
      this->Size = System::Drawing::Size( 500, 250 );

      // Initializes the data properties.
      typeComponents = gcnew array<String^>(0);
      basetypeComponents = gcnew array<String^>(0);
      selected_typename = "None selected.";
      selected_basetypename = "None selected.";
      selected_componentname = "None selected.";
      selectionService = nullptr;
   }


   property System::ComponentModel::ISite^ Site 
   {
      // Registers and unregisters design-mode services when 
      // the component is sited and unsited.
      virtual System::ComponentModel::ISite^ get() override
      {
         // Returns the site for the control.
         return __super::Site;
      }

      virtual void set( System::ComponentModel::ISite^ value ) override
      {
         // 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 != nullptr )
                  selectionService->SelectionChanged -= gcnew EventHandler( this, &IReferenceServiceControl::OnSelectionChanged );

         // Sites the control.
         __super::Site = value;

         // Obtains an ISelectionService interface to register 
         // the selection changed event handler with.
         selectionService = dynamic_cast<ISelectionService^>(this->GetService( ISelectionService::typeid ));
         if ( selectionService != nullptr )
         {
            selectionService->SelectionChanged += gcnew EventHandler( this, &IReferenceServiceControl::OnSelectionChanged );

            // Updates the display for the current selection, if any.
            DisplayComponentsOfSelectedComponentType();
         }
      }
   }

private:

   // 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.
   void DisplayComponentsOfSelectedComponentType()
   {
      // If a component is selected...
      if ( selectionService->PrimarySelection != nullptr )
      {
         // 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( IReferenceService::typeid ));
         if ( rs != nullptr )
         {
            // Get references to design-mode components of the 
            // primary selected component's type.
            array<Object^>^comps = (array<Object^>^)rs->GetReferences( selectionService->PrimarySelection->GetType() );
            typeComponents = gcnew array<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 = (array<Object^>^)rs->GetReferences( selectionService->PrimarySelection->GetType()->BaseType );
            basetypeComponents = gcnew array<String^>(comps->Length);
            for ( int i = 0; i < comps->Length; i++ )
               basetypeComponents[ i ] = (dynamic_cast<IComponent^>(comps[ i ]))->Site->Name;
         }
      }
      else
      {
         selected_typename = "None selected.";
         selected_basetypename = "None selected.";
         selected_componentname = "None selected.";
         typeComponents = gcnew array<String^>(0);
         basetypeComponents = gcnew array<String^>(0);
      }

      this->Refresh();
   }

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


protected:
   virtual void OnPaint( System::Windows::Forms::PaintEventArgs^ e ) override
   {
      e->Graphics->DrawString( "IReferenceService Example Control", gcnew System::Drawing::Font( FontFamily::GenericMonospace,9 ), gcnew SolidBrush( Color::Blue ), 5, 5 );
      e->Graphics->DrawString( "Primary Selected Component from IComponentChangeService:", gcnew System::Drawing::Font( FontFamily::GenericMonospace,8 ), gcnew SolidBrush( Color::Red ), 5, 20 );
      e->Graphics->DrawString( String::Format( "Name:      {0}", selected_componentname ), gcnew System::Drawing::Font( FontFamily::GenericMonospace,8 ), gcnew SolidBrush( Color::Black ), 10, 32 );
      e->Graphics->DrawString( String::Format( "Type:      {0}", selected_typename ), gcnew System::Drawing::Font( FontFamily::GenericMonospace,8 ), gcnew SolidBrush( Color::Black ), 10, 44 );
      e->Graphics->DrawString( String::Format( "Base Type: {0}", selected_basetypename ), gcnew System::Drawing::Font( FontFamily::GenericMonospace,8 ), gcnew SolidBrush( Color::Black ), 10, 56 );
      e->Graphics->DrawLine( gcnew Pen( gcnew SolidBrush( Color::Black ),1 ), 5, 77, this->Width - 5, 77 );
      e->Graphics->DrawString( "Components of Type from IReferenceService:", gcnew System::Drawing::Font( FontFamily::GenericMonospace,8 ), gcnew SolidBrush( Color::Red ), 5, 85 );
      if (  !selected_typename->Equals( "None selected." ) )
            for ( int i = 0; i < typeComponents->Length; i++ )
         e->Graphics->DrawString( typeComponents[ i ], gcnew System::Drawing::Font( FontFamily::GenericMonospace,8 ), gcnew SolidBrush( Color::Black ), 20.f, 97.f + (i * 12) );

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

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

        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

    End Class
End Namespace 'IReferenceServiceExample

注解

接口 IReferenceService 提供以下方法:

  • 方法 GetReference 返回具有指定名称的组件,或者 null 如果未找到具有指定名称的组件,则返回 。

  • 方法 GetName 返回与指定组件关联的名称。

  • 方法 GetComponent 返回指定组件的父容器。

  • 方法 GetReferences 返回对所有项目组件或可选指定类型的所有项目组件的引用数组。

方法

GetComponent(Object)

获取包含指定组件的组件。

GetName(Object)

获取指定组件的名称。

GetReference(String)

获取对其名称与指定名称匹配的组件的引用。

GetReferences()

获取对项目组件的所有可用的引用。

GetReferences(Type)

获取对指定类型组件的所有可用引用。

适用于