IComponentChangeService 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
提供可加入和移除事件處理常式的介面給加入、變更、移除或重新命名元件的事件,並提供可引發 ComponentChanged 或 ComponentChanging 事件的方法。
public interface class IComponentChangeService
public interface IComponentChangeService
[System.Runtime.InteropServices.ComVisible(true)]
public interface IComponentChangeService
type IComponentChangeService = interface
[<System.Runtime.InteropServices.ComVisible(true)>]
type IComponentChangeService = interface
Public Interface IComponentChangeService
- 屬性
範例
下列範例示範如何使用 IComponentChangeService 介面來接收有關在設計模式中新增、移除和變更元件的相關通知。
#using <system.dll>
#using <system.windows.forms.dll>
#using <system.drawing.dll>
using namespace System;
using namespace System::Drawing;
using namespace System::Collections;
using namespace System::ComponentModel;
using namespace System::ComponentModel::Design;
using namespace System::Windows::Forms;
/* This sample illustrates how to use the IComponentChangeService interface
to handle component change events. The ComponentClass control attaches
event handlers when it is sited in a document, and displays a message
when notification that a component has been added, removed, or changed
is received from the IComponentChangeService.
To run this sample, add the ComponentClass control to a Form and
add, remove, or change components to see the behavior of the
component change event handlers. */
public ref class ComponentClass: public UserControl
{
private:
System::ComponentModel::Container^ components;
ListBox^ listBox1;
IComponentChangeService^ m_changeService;
void InitializeComponent()
{
this->listBox1 = gcnew ListBox;
this->SuspendLayout();
// listBox1.
this->listBox1->Location = System::Drawing::Point( 24, 16 );
this->listBox1->Name = "listBox1";
this->listBox1->Size = System::Drawing::Size( 576, 277 );
this->listBox1->TabIndex = 0;
// ComponentClass.
array<Control^>^myArray = {listBox1};
this->Controls->AddRange( myArray );
this->Name = "ComponentClass";
this->Size = System::Drawing::Size( 624, 320 );
this->ResumeLayout( false );
}
void ClearChangeNotifications()
{
// The m_changeService value is 0 when not in design mode,
// as the IComponentChangeService is only available at design time.
m_changeService = dynamic_cast<IComponentChangeService^>(GetService( IComponentChangeService::typeid ));
// Clear our the component change events to prepare for re-siting.
if ( m_changeService != nullptr )
{
m_changeService->ComponentChanged -= gcnew ComponentChangedEventHandler( this, &ComponentClass::OnComponentChanged );
m_changeService->ComponentChanging -= gcnew ComponentChangingEventHandler( this, &ComponentClass::OnComponentChanging );
m_changeService->ComponentAdded -= gcnew ComponentEventHandler( this, &ComponentClass::OnComponentAdded );
m_changeService->ComponentAdding -= gcnew ComponentEventHandler( this, &ComponentClass::OnComponentAdding );
m_changeService->ComponentRemoved -= gcnew ComponentEventHandler( this, &ComponentClass::OnComponentRemoved );
m_changeService->ComponentRemoving -= gcnew ComponentEventHandler( this, &ComponentClass::OnComponentRemoving );
m_changeService->ComponentRename -= gcnew ComponentRenameEventHandler( this, &ComponentClass::OnComponentRename );
}
}
void RegisterChangeNotifications()
{
// Register the event handlers for the IComponentChangeService events
if ( m_changeService != nullptr )
{
m_changeService->ComponentChanged += gcnew ComponentChangedEventHandler( this, &ComponentClass::OnComponentChanged );
m_changeService->ComponentChanging += gcnew ComponentChangingEventHandler( this, &ComponentClass::OnComponentChanging );
m_changeService->ComponentAdded += gcnew ComponentEventHandler( this, &ComponentClass::OnComponentAdded );
m_changeService->ComponentAdding += gcnew ComponentEventHandler( this, &ComponentClass::OnComponentAdding );
m_changeService->ComponentRemoved += gcnew ComponentEventHandler( this, &ComponentClass::OnComponentRemoved );
m_changeService->ComponentRemoving += gcnew ComponentEventHandler( this, &ComponentClass::OnComponentRemoving );
m_changeService->ComponentRename += gcnew ComponentRenameEventHandler( this, &ComponentClass::OnComponentRename );
}
}
/* This method handles the OnComponentChanged event to display a notification. */
void OnComponentChanged( Object^ /*sender*/, ComponentChangedEventArgs^ ce )
{
if ( ce->Component != nullptr && static_cast<IComponent^>(ce->Component)->Site != nullptr && ce->Member != nullptr )
OnUserChange( "The " + ce->Member->Name + " member of the " + static_cast<IComponent^>(ce->Component)->Site->Name + " component has been changed." );
}
/* This method handles the OnComponentChanging event to display a notification. */
void OnComponentChanging( Object^ /*sender*/, ComponentChangingEventArgs^ ce )
{
if ( ce->Component != nullptr && static_cast<IComponent^>(ce->Component)->Site != nullptr && ce->Member != nullptr )
OnUserChange( "The " + ce->Member->Name + " member of the " + static_cast<IComponent^>(ce->Component)->Site->Name + " component is being changed." );
}
/* This method handles the OnComponentAdded event to display a notification. */
void OnComponentAdded( Object^ /*sender*/, ComponentEventArgs^ ce )
{
OnUserChange( "A component, " + ce->Component->Site->Name + ", has been added." );
}
/* This method handles the OnComponentAdding event to display a notification. */
void OnComponentAdding( Object^ /*sender*/, ComponentEventArgs^ ce )
{
OnUserChange( "A component of type " + ce->Component->GetType()->FullName + " is being added." );
}
/* This method handles the OnComponentRemoved event to display a notification. */
void OnComponentRemoved( Object^ /*sender*/, ComponentEventArgs^ ce )
{
OnUserChange( "A component, " + ce->Component->Site->Name + ", has been removed." );
}
/* This method handles the OnComponentRemoving event to display a notification. */
void OnComponentRemoving( Object^ /*sender*/, ComponentEventArgs^ ce )
{
OnUserChange( "A component, " + ce->Component->Site->Name + ", is being removed." );
}
/* This method handles the OnComponentRename event to display a notification. */
void OnComponentRename( Object^ /*sender*/, ComponentRenameEventArgs^ ce )
{
OnUserChange( "A component, " + ce->OldName + ", was renamed to " + ce->NewName + "." );
}
// This method adds a specified notification message to the control's listbox.
void OnUserChange( String^ text )
{
listBox1->Items->Add( text );
}
public:
ComponentClass()
{
InitializeComponent();
}
property ISite^ Site
{
// This override allows the control to register event handlers for IComponentChangeService events
// at the time the control is sited, which happens only in design mode.
virtual ISite^ get() override
{
return Site;
}
virtual void set( ISite^ value ) override
{
// Clear any component change event handlers.
ClearChangeNotifications();
// Set the new Site value.
Site = value;
m_changeService = static_cast<IComponentChangeService^>(GetService( IComponentChangeService::typeid ));
// Register event handlers for component change events.
RegisterChangeNotifications();
}
}
// Clean up any resources being used.
public:
~ComponentClass()
{
ClearChangeNotifications();
if ( components != nullptr )
{
delete components;
}
}
};
using System;
using System.Data;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
/* This sample illustrates how to use the IComponentChangeService interface
to handle component change events. The ComponentClass control attaches
event handlers when it is sited in a document, and displays a message
when notification that a component has been added, removed, or changed
is received from the IComponentChangeService.
To run this sample, add the ComponentClass control to a Form and
add, remove, or change components to see the behavior of the
component change event handlers. */
namespace IComponentChangeServiceExample
{
public class ComponentClass : System.Windows.Forms.UserControl
{
private System.ComponentModel.Container components = null;
private System.Windows.Forms.ListBox listBox1;
private IComponentChangeService m_changeService;
public ComponentClass()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.listBox1 = new System.Windows.Forms.ListBox();
this.SuspendLayout();
// listBox1.
this.listBox1.Location = new System.Drawing.Point(24, 16);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(576, 277);
this.listBox1.TabIndex = 0;
// ComponentClass.
this.Controls.AddRange(new System.Windows.Forms.Control[] {this.listBox1});
this.Name = "ComponentClass";
this.Size = new System.Drawing.Size(624, 320);
this.ResumeLayout(false);
}
// This override allows the control to register event handlers for IComponentChangeService events
// at the time the control is sited, which happens only in design mode.
public override ISite Site
{
get
{
return base.Site;
}
set
{
// Clear any component change event handlers.
ClearChangeNotifications();
// Set the new Site value.
base.Site = value;
m_changeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));
// Register event handlers for component change events.
RegisterChangeNotifications();
}
}
private void ClearChangeNotifications()
{
// The m_changeService value is null when not in design mode,
// as the IComponentChangeService is only available at design time.
m_changeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));
// Clear our the component change events to prepare for re-siting.
if (m_changeService != null)
{
m_changeService.ComponentChanged -= new ComponentChangedEventHandler(OnComponentChanged);
m_changeService.ComponentChanging -= new ComponentChangingEventHandler(OnComponentChanging);
m_changeService.ComponentAdded -= new ComponentEventHandler(OnComponentAdded);
m_changeService.ComponentAdding -= new ComponentEventHandler(OnComponentAdding);
m_changeService.ComponentRemoved -= new ComponentEventHandler(OnComponentRemoved);
m_changeService.ComponentRemoving -= new ComponentEventHandler(OnComponentRemoving);
m_changeService.ComponentRename -= new ComponentRenameEventHandler(OnComponentRename);
}
}
private void RegisterChangeNotifications()
{
// Register the event handlers for the IComponentChangeService events
if (m_changeService != null)
{
m_changeService.ComponentChanged += new ComponentChangedEventHandler(OnComponentChanged);
m_changeService.ComponentChanging += new ComponentChangingEventHandler(OnComponentChanging);
m_changeService.ComponentAdded += new ComponentEventHandler(OnComponentAdded);
m_changeService.ComponentAdding += new ComponentEventHandler(OnComponentAdding);
m_changeService.ComponentRemoved += new ComponentEventHandler(OnComponentRemoved);
m_changeService.ComponentRemoving += new ComponentEventHandler(OnComponentRemoving);
m_changeService.ComponentRename += new ComponentRenameEventHandler(OnComponentRename);
}
}
/* This method handles the OnComponentChanged event to display a notification. */
private void OnComponentChanged(object sender, ComponentChangedEventArgs ce)
{
if( ce.Component != null && ((IComponent)ce.Component).Site != null && ce.Member != null )
OnUserChange("The " + ce.Member.Name + " member of the " + ((IComponent)ce.Component).Site.Name + " component has been changed.");
}
/* This method handles the OnComponentChanging event to display a notification. */
private void OnComponentChanging(object sender, ComponentChangingEventArgs ce)
{
if( ce.Component != null && ((IComponent)ce.Component).Site != null && ce.Member != null )
OnUserChange("The " + ce.Member.Name + " member of the " + ((IComponent)ce.Component).Site.Name + " component is being changed.");
}
/* This method handles the OnComponentAdded event to display a notification. */
private void OnComponentAdded(object sender, ComponentEventArgs ce)
{
OnUserChange("A component, " + ce.Component.Site.Name + ", has been added.");
}
/* This method handles the OnComponentAdding event to display a notification. */
private void OnComponentAdding(object sender, ComponentEventArgs ce)
{
OnUserChange("A component of type " + ce.Component.GetType().FullName + " is being added.");
}
/* This method handles the OnComponentRemoved event to display a notification. */
private void OnComponentRemoved(object sender, ComponentEventArgs ce)
{
OnUserChange("A component, " + ce.Component.Site.Name + ", has been removed.");
}
/* This method handles the OnComponentRemoving event to display a notification. */
private void OnComponentRemoving(object sender, ComponentEventArgs ce)
{
OnUserChange("A component, " + ce.Component.Site.Name + ", is being removed.");
}
/* This method handles the OnComponentRename event to display a notification. */
private void OnComponentRename(object sender, ComponentRenameEventArgs ce)
{
OnUserChange("A component, " + ce.OldName + ", was renamed to " + ce.NewName +".");
}
// This method adds a specified notification message to the control's listbox.
private void OnUserChange(string text)
{
listBox1.Items.Add(text);
}
// Clean up any resources being used.
protected override void Dispose( bool disposing )
{
if( disposing )
{
ClearChangeNotifications();
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
}
}
Imports System.Data
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Windows.Forms
' This sample illustrates how to use the IComponentChangeService interface
' to handle component change events. The ComponentClass control attaches
' event handlers when it is sited in a document, and displays a message
' when notification that a component has been added, removed, or changed
' is received from the IComponentChangeService.
' To run this sample, add the ComponentClass control to a Form and
' add, remove, or change components to see the behavior of the
' component change event handlers.
Namespace IComponentChangeServiceExample
_
Public Class ComponentClass
Inherits System.Windows.Forms.UserControl
Private components As System.ComponentModel.Container = Nothing
Private listBox1 As System.Windows.Forms.ListBox
Private m_changeService As IComponentChangeService
Public Sub New()
InitializeComponent()
End Sub
Private Sub InitializeComponent()
Me.listBox1 = New System.Windows.Forms.ListBox()
Me.SuspendLayout()
' listBox1.
Me.listBox1.Location = New System.Drawing.Point(24, 16)
Me.listBox1.Name = "listBox1"
Me.listBox1.Size = New System.Drawing.Size(576, 277)
Me.listBox1.TabIndex = 0
' ComponentClass.
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.listBox1})
Me.Name = "ComponentClass"
Me.Size = New System.Drawing.Size(624, 320)
Me.ResumeLayout(False)
End Sub
' This override allows the control to register event handlers for IComponentChangeService events
' at the time the control is sited, which happens only in design mode.
Public Overrides Property Site() As ISite
Get
Return MyBase.Site
End Get
Set(ByVal Value As ISite)
' Clear any component change event handlers.
ClearChangeNotifications()
' Set the new Site value.
MyBase.Site = Value
m_changeService = CType(GetService(GetType(IComponentChangeService)), IComponentChangeService)
' Register event handlers for component change events.
RegisterChangeNotifications()
End Set
End Property
Private Sub ClearChangeNotifications()
' The m_changeService value is null when not in design mode,
' as the IComponentChangeService is only available at design time.
m_changeService = CType(GetService(GetType(IComponentChangeService)), IComponentChangeService)
' Clear our the component change events to prepare for re-siting.
If (m_changeService IsNot Nothing) Then
RemoveHandler m_changeService.ComponentChanged, AddressOf OnComponentChanged
RemoveHandler m_changeService.ComponentChanging, AddressOf OnComponentChanging
RemoveHandler m_changeService.ComponentAdded, AddressOf OnComponentAdded
RemoveHandler m_changeService.ComponentAdding, AddressOf OnComponentAdding
RemoveHandler m_changeService.ComponentRemoved, AddressOf OnComponentRemoved
RemoveHandler m_changeService.ComponentRemoving, AddressOf OnComponentRemoving
RemoveHandler m_changeService.ComponentRename, AddressOf OnComponentRename
End If
End Sub
Private Sub RegisterChangeNotifications()
' Register the event handlers for the IComponentChangeService events
If (m_changeService IsNot Nothing) Then
AddHandler m_changeService.ComponentChanged, AddressOf OnComponentChanged
AddHandler m_changeService.ComponentChanging, AddressOf OnComponentChanging
AddHandler m_changeService.ComponentAdded, AddressOf OnComponentAdded
AddHandler m_changeService.ComponentAdding, AddressOf OnComponentAdding
AddHandler m_changeService.ComponentRemoved, AddressOf OnComponentRemoved
AddHandler m_changeService.ComponentRemoving, AddressOf OnComponentRemoving
AddHandler m_changeService.ComponentRename, AddressOf OnComponentRename
End If
End Sub
' This method handles the OnComponentChanged event to display a notification.
Private Sub OnComponentChanged(ByVal sender As Object, ByVal ce As ComponentChangedEventArgs)
If (ce.Component IsNot Nothing) And (CType(ce.Component, IComponent).Site IsNot Nothing) And (ce.Member IsNot Nothing) Then
OnUserChange(("The " + ce.Member.Name + " member of the " + CType(ce.Component, IComponent).Site.Name + " component has been changed."))
End If
End Sub
' This method handles the OnComponentChanging event to display a notification.
Private Sub OnComponentChanging(ByVal sender As Object, ByVal ce As ComponentChangingEventArgs)
If (ce.Component IsNot Nothing) And (CType(ce.Component, IComponent).Site IsNot Nothing) And (ce.Member IsNot Nothing) Then
OnUserChange(("The " + ce.Member.Name + " member of the " + CType(ce.Component, IComponent).Site.Name + " component is being changed."))
End If
End Sub
' This method handles the OnComponentAdded event to display a notification.
Private Sub OnComponentAdded(ByVal sender As Object, ByVal ce As ComponentEventArgs)
OnUserChange(("A component, " + ce.Component.Site.Name + ", has been added."))
End Sub
' This method handles the OnComponentAdding event to display a notification.
Private Sub OnComponentAdding(ByVal sender As Object, ByVal ce As ComponentEventArgs)
OnUserChange(("A component of type " + (CType(ce.Component, Component)).GetType().FullName + " is being added."))
End Sub
' This method handles the OnComponentRemoved event to display a notification.
Private Sub OnComponentRemoved(ByVal sender As Object, ByVal ce As ComponentEventArgs)
OnUserChange(("A component, " + ce.Component.Site.Name + ", has been removed."))
End Sub
' This method handles the OnComponentRemoving event to display a notification.
Private Sub OnComponentRemoving(ByVal sender As Object, ByVal ce As ComponentEventArgs)
OnUserChange(("A component, " + ce.Component.Site.Name + ", is being removed."))
End Sub
' This method handles the OnComponentRename event to display a notification.
Private Sub OnComponentRename(ByVal sender As Object, ByVal ce As ComponentRenameEventArgs)
OnUserChange(("A component, " + ce.OldName + ", was renamed to " + ce.NewName + "."))
End Sub
' This method adds a specified notification message to the control's listbox.
Private Sub OnUserChange(ByVal [text] As String)
listBox1.Items.Add([text])
End Sub
' Clean up any resources being used.
Protected Overloads Sub Dispose(ByVal disposing As Boolean)
If disposing Then
ClearChangeNotifications()
If (components IsNot Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
End Class
End Namespace
備註
IComponentChangeService 提供介面,可用來指出處理下列事件的方法:
ComponentAdded,會在加入元件時引發。
ComponentAdding,當元件即將加入時引發。
ComponentChanged,會在元件變更時引發。
ComponentChanging,當元件即將變更時引發。
ComponentRemoved,會在移除元件時引發。
ComponentRemoving,當元件即將移除時引發。
ComponentRename,會在重新命名元件時引發。
一般而言,設計環境會引發這些元件新增、變更、移除或重新命名事件。 設計工具在使用 物件來提供影響元件之設計時間動作的復原和取消復原功能時 DesignerTransaction ,應該呼叫這個介面的方法。 如需詳細資訊,請參閱 檔 DesignerTransaction。 一般而言,只有根設計工具會處理這些變更通知。
此服務也提供引發元件變更事件或元件變更事件的方法。 PropertyDescriptor或元件可以指出元件已變更或分別使用 OnComponentChanged 和 OnComponentChanging 方法變更。
方法
OnComponentChanged(Object, MemberDescriptor, Object, Object) |
向元件變更服務通知特定元件已變更。 |
OnComponentChanging(Object, MemberDescriptor) |
向元件變更服務通知特定元件正在變更。 |
事件
ComponentAdded |
發生於元件已加入時。 |
ComponentAdding |
發生於正在加入元件的過程中。 |
ComponentChanged |
發生於元件已變更時。 |
ComponentChanging |
發生於正在變更元件的過程中。 |
ComponentRemoved |
發生於元件已移除時。 |
ComponentRemoving |
發生於正在移除元件的過程中。 |
ComponentRename |
發生於元件重新命名時。 |