Поделиться через


Разработка пользовательского интерфейса для пользовательского диспетчера соединений

После переопределения реализации свойств и методов базового класса для выполнения пользовательских функций может потребоваться создание нестандартного пользовательского интерфейса для диспетчера соединений. Если собственный пользовательский интерфейс не создается, пользователи могут настроить только диспетчер соединений в диалоговом окне «Свойства».

В проекте или сборке собственного пользовательского интерфейса обычно существует два класса: класс, реализующий интерфейс IDtsConnectionManagerUI, и отображаемая им форма Windows для получения сведений от пользователя.

Важное примечаниеВажно!

После подписи и построения собственного пользовательского интерфейса и его установки в глобальный кэш сборок, как описано в разделе Написание кода для пользовательского диспетчера соединений, необходимо указать полное имя этого класса в свойстве UITypeName атрибута DtsConnectionAttribute.

Образцы пользовательских диспетчеров соединений см. в образцах служб Integration Services в разделе Codeplex. Примеры кода, приведенные в этом разделе, взяты из образца пользовательского диспетчера соединений SQL Server.

ПримечаниеПримечание

Большая часть задач, источников и назначений в службах Integration Services работает только с определенными типами встроенных диспетчеров соединений. Поэтому данные образцы нельзя протестировать с помощью встроенных задач и компонентов.

Написание кода для класса пользовательского интерфейса

Интерфейс IDtsConnectionManagerUI имеет четыре метода: Initialize, New, Edit и Delete. Эти четыре метода описаны в следующих разделах.

ПримечаниеПримечание

Возможно, писать код для метода Delete не потребуется, если при удалении пользователем экземпляра диспетчера соединений очистка не нужна.

Инициализация пользовательского интерфейса

В методе Initialize конструктор указывает ссылку на диспетчер соединений, настроенный таким образом, что пользовательский интерфейс может изменять его свойства. Как показано в следующем коде, эту ссылку на диспетчер соединений необходимо кэшировать для последующего использования.

Public Sub Initialize(ByVal connectionManager As Microsoft.SqlServer.Dts.Runtime.ConnectionManager, ByVal serviceProvider As System.IServiceProvider) Implements Microsoft.SqlServer.Dts.Runtime.Design.IDtsConnectionManagerUI.Initialize

    _connectionManager = connectionManager
    _serviceProvider = serviceProvider

  End Sub
    public void Initialize(Microsoft.SqlServer.Dts.Runtime.ConnectionManager connectionManager, System.IServiceProvider serviceProvider)
    {

      _connectionManager = connectionManager;
      _serviceProvider = serviceProvider;

    }

Создание нового экземпляра пользовательского интерфейса

Метод New, который не является конструктором, вызывается после метода Initialize, когда пользователь создает новый экземпляр диспетчера соединений. Метод New обычно отображает форму для изменения, кроме случая, когда пользователь копирует, а затем вставляет существующий диспетчер соединений. В следующем коде показана реализация этого метода.

  Public Function [New](ByVal parentWindow As System.Windows.Forms.IWin32Window, ByVal connections As Microsoft.SqlServer.Dts.Runtime.Connections, ByVal connectionUIArgs As Microsoft.SqlServer.Dts.Runtime.Design.ConnectionManagerUIArgs) As Boolean Implements Microsoft.SqlServer.Dts.Runtime.Design.IDtsConnectionManagerUI.New

    Dim clipboardService As IDtsClipboardService

    clipboardService = _
      DirectCast(_serviceProvider.GetService(GetType(IDtsClipboardService)), IDtsClipboardService)
    If Not clipboardService Is Nothing Then
      ' If the connection manager has been copied and pasted, take no action.
      If clipboardService.IsPasteActive Then
        Return True
      End If
    End If

    Return EditSqlConnection(parentWindow)

  End Function
  public bool New(System.Windows.Forms.IWin32Window parentWindow, Microsoft.SqlServer.Dts.Runtime.Connections connections, Microsoft.SqlServer.Dts.Runtime.Design.ConnectionManagerUIArgs connectionUIArgs)
    {
      IDtsClipboardService clipboardService;

      clipboardService = (IDtsClipboardService)_serviceProvider.GetService(typeof(IDtsClipboardService));
      if (clipboardService != null)
      // If connection manager has been copied and pasted, take no action.
      {
        if (clipboardService.IsPasteActive)
        {
          return true;
        }
      }

      return EditSqlConnection(parentWindow);
    }

Изменение диспетчера соединений

Поскольку форма для изменения вызывается как методом New, так и методом Edit, удобно использовать вспомогательную функцию, чтобы инкапсулировать код, отображающий эту форму. В следующем коде показана реализация вспомогательной функции.

  Private Function EditSqlConnection(ByVal parentWindow As IWin32Window) As Boolean

    Dim sqlCMUIForm As New SqlConnMgrUIFormVB

    sqlCMUIForm.Initialize(_connectionManager, _serviceProvider)
    If sqlCMUIForm.ShowDialog(parentWindow) = DialogResult.OK Then
      Return True
    Else
      Return False
    End If

  End Function
   private bool EditSqlConnection(IWin32Window parentWindow)
    {

      SqlConnMgrUIFormCS sqlCMUIForm = new SqlConnMgrUIFormCS();

      sqlCMUIForm.Initialize(_connectionManager, _serviceProvider);
      if (sqlCMUIForm.ShowDialog(parentWindow) == DialogResult.OK)
      {
        return true;
      }
      else
      {
        return false;
      }

    }

В методе Edit нужно просто отобразить форму для изменения. В следующем коде показана реализация метода Edit, использующего вспомогательную функции для инкапсуляции кода формы.

  Public Function Edit(ByVal parentWindow As System.Windows.Forms.IWin32Window, ByVal connections As Microsoft.SqlServer.Dts.Runtime.Connections, ByVal connectionUIArg As Microsoft.SqlServer.Dts.Runtime.Design.ConnectionManagerUIArgs) As Boolean Implements Microsoft.SqlServer.Dts.Runtime.Design.IDtsConnectionManagerUI.Edit

    Return EditSqlConnection(parentWindow)

  End Function
    public bool Edit(System.Windows.Forms.IWin32Window parentWindow, Microsoft.SqlServer.Dts.Runtime.Connections connections, Microsoft.SqlServer.Dts.Runtime.Design.ConnectionManagerUIArgs connectionUIArg)
    {

      return EditSqlConnection(parentWindow);

    }

Написание кода для формы пользовательского интерфейса

После создания класса пользовательского интерфейса, реализующего методы интерфейса IDtsConnectionManagerUI, необходимо создать форму Windows, в которой пользователь сможет настраивать свойства диспетчера соединений.

Инициализация формы пользовательского интерфейса

При отображении пользовательской формы для изменения можно передать ссылку на изменяемый диспетчер соединений. Эту ссылку можно передать или с помощью пользовательского конструктора для класса формы, или создав собственный метод Initialize, как показано ниже.

  Public Sub Initialize(ByVal connectionManager As ConnectionManager, ByVal serviceProvider As IServiceProvider)

    _connectionManager = connectionManager
    _serviceProvider = serviceProvider
    ConfigureControlsFromConnectionManager()
    EnableControls()

  End Sub
   public void Initialize(ConnectionManager connectionManager, IServiceProvider serviceProvider)
    {

      _connectionManager = connectionManager;
      _serviceProvider = serviceProvider;
      ConfigureControlsFromConnectionManager();
      EnableControls();

    }

Установка свойств формы пользовательского интерфейса

Наконец, классу формы необходима вспомогательная функция, которая при первой загрузке форме заполняет элементы управления в ней существующими значениями или значениями по умолчанию свойств диспетчера соединений. Классу формы также требуется подобная функция, которая устанавливает значения свойств, введенных пользователем, когда он нажимает кнопку «ОК» и закрывает форму.

  Private Const CONNECTIONNAME_BASE As String = "SqlConnectionManager"

  Private Sub ConfigureControlsFromConnectionManager()

    Dim tempName As String
    Dim tempServerName As String
    Dim tempDatabaseName As String

    With _connectionManager

      tempName = .Properties("Name").GetValue(_connectionManager).ToString
      If Not String.IsNullOrEmpty(tempName) Then
        _connectionName = tempName
      Else
        _connectionName = CONNECTIONNAME_BASE
      End If

      tempServerName = .Properties("ServerName").GetValue(_connectionManager).ToString
      If Not String.IsNullOrEmpty(tempServerName) Then
        _serverName = tempServerName
        txtServerName.Text = _serverName
      End If

      tempDatabaseName = .Properties("DatabaseName").GetValue(_connectionManager).ToString
      If Not String.IsNullOrEmpty(tempDatabaseName) Then
        _databaseName = tempDatabaseName
        txtDatabaseName.Text = _databaseName
      End If

    End With

  End Sub

  Private Sub ConfigureConnectionManagerFromControls()

    With _connectionManager
      .Properties("Name").SetValue(_connectionManager, _connectionName)
      .Properties("ServerName").SetValue(_connectionManager, _serverName)
      .Properties("DatabaseName").SetValue(_connectionManager, _databaseName)
    End With

  End Sub
   private const string CONNECTIONNAME_BASE = "SqlConnectionManager";

   private void ConfigureControlsFromConnectionManager()
    {

      string tempName;
      string tempServerName;
      string tempDatabaseName;

      {
        tempName = _connectionManager.Properties["Name"].GetValue(_connectionManager).ToString();
        if (!String.IsNullOrEmpty(tempName))
        {
          _connectionName = tempName;
        }
        else
        {
          _connectionName = CONNECTIONNAME_BASE;
        }

        tempServerName = _connectionManager.Properties["ServerName"].GetValue(_connectionManager).ToString();
        if (!String.IsNullOrEmpty(tempServerName))
        {
          _serverName = tempServerName;
          txtServerName.Text = _serverName;
        }

        tempDatabaseName = _connectionManager.Properties["DatabaseName"].GetValue(_connectionManager).ToString();
        if (!String.IsNullOrEmpty(tempDatabaseName))
        {
          _databaseName = tempDatabaseName;
          txtDatabaseName.Text = _databaseName;
        }

      }

    }

    private void ConfigureConnectionManagerFromControls()
    {

      {
        _connectionManager.Properties["Name"].SetValue(_connectionManager, _connectionName);
        _connectionManager.Properties["ServerName"].SetValue(_connectionManager, _serverName);
        _connectionManager.Properties["DatabaseName"].SetValue(_connectionManager, _databaseName);
      }

    }
Значок служб Integration Services (маленький) Будьте в курсе новых возможностей cлужб Integration Services

Чтобы загружать новейшую документацию, статьи, образцы и видеоматериалы от корпорации Майкрософт, а также лучшие решения от участников сообщества, посетите страницу служб Integration Services на узлах MSDN или TechNet:

Чтобы получать автоматические уведомления об этих обновлениях, подпишитесь на RSS-каналы, предлагаемые на этой странице.

Журнал изменений

Обновления

  • Добавлено примечание, объясняющее, почему нестандартные образцы нельзя протестировать с помощью встроенных задач и компонентов служб Integration Services.