Partilhar via


Persistência controles dinâmicos em documentos do Office

Se aplica a

As informações contidas neste tópico se aplicam apenas às especificado Ferramentas do Visual Studio para o Office projetos e as versões do Microsoft Office.

Projetos de nível de documento

  • O Excel 2003

  • O Excel 2007

  • Word 2003

  • Word 2007

Projetos de nível de aplicativo

  • O Excel 2007

  • Word 2007

For more information, see Recursos disponíveis pelo aplicativo e o tipo de projeto.

Controles que são adicionados em tempo de execução não são persistentes quando o documento ou pasta de trabalho é salvo e fechada.O comportamento exato é diferente para controles de host e controles de Windows Forms.Em ambos os casos, você pode adicionar código à sua solução para recriar os controles quando o usuário reabrirá o documento.

Controla o que você Adicionar para documentos em tempo de execução são chamados de controles dinâmicos .Para obter mais informações sobre controles dinâmicos, consulte Adicionar controles a documentos do Office em tempo de execução.

Controles de host persistentes no documento

Quando um documento é salvo e, em seguida, Fechada, Tudo controles de host dinâmico são removidos do documento.Somente os subjacentes objetos Office nativos permanecem atrás.Por exemplo, um Controlarar de host Microsoft.Office.Tools.Excel.ListObject se torna um Microsoft.Office.Interop.Excel.ListObject.Os objetos do Office nativos não estiver conectados a eventos de Controlarar de host, e eles não têm a funcionalidade de ligação de dados do Controlarar host.

A tabela a seguir lista o objeto do Office nativo que Esquerda behind em um documento para cada tipo de Controlarar de host.

Tipo de Controlarar de host

Tipo de objeto do Office nativo

Microsoft.Office.Tools.Excel.Chart

Microsoft.Office.Interop.Excel.Chart

Microsoft.Office.Tools.Excel.ListObject

Microsoft.Office.Interop.Excel.ListObject

Microsoft.Office.Tools.Excel.NamedRange

Microsoft.Office.Interop.Excel.Range

Microsoft.Office.Tools.Word.Bookmark

Microsoft.Office.Interop.Word.Bookmark

Microsoft.Office.Tools.Word.BuildingBlockGalleryContentControl

Microsoft.Office.Tools.Word.ComboBoxContentControl

Microsoft.Office.Tools.Word.ContentControl

Microsoft.Office.Tools.Word.DatePickerContentControl

Microsoft.Office.Tools.Word.DropDownListContentControl

Microsoft.Office.Tools.Word.GroupContentControl

Microsoft.Office.Tools.Word.PictureContentControl

Microsoft.Office.Tools.Word.PlainTextContentControl

Microsoft.Office.Tools.Word.RichTextContentControl

Microsoft.Office.Interop.Word.ContentControl

Re-Creating controles de host dinâmicos Quando documentos são abertos

Você pode recriar controles de host dinâmico no lugar de controles nativos existentes toda vez que um usuário abre o documento.Criando controles host dessa maneira quando um documento é aberto simula a experiência que os usuários podem esperar.

Para recriar um Controlarar de host para o Word, ou um Microsoft.Office.Tools.Excel.NamedRange ou Controlarar de host de Microsoft.Office.Tools.Excel.ListObject para o Excel, use um Add<Controlarar classe > método do Microsoft.Office.Tools.Excel.ControlCollection ou Microsoft.Office.Tools.Word.ControlCollection classes que tem um parâmetro para o objeto do Office nativo.

Por exemplo, se você deseja criar um Controlarar de host Microsoft.Office.Tools.Excel.ListObject de um existente nativo Microsoft.Office.Interop.Excel.ListObject quando o documento é aberto, use o método AddListObject(ListObject) e passar a existente Microsoft.Office.Interop.Excel.ListObject.O exemplo de código a seguir demonstra isso em um projeto de nível de documento para o Excel 2007.O código recria um Microsoft.Office.Tools.Excel.ListObject dinâmico baseado em uma existente Microsoft.Office.Interop.Excel.ListObject chamado MyListObject na classe Sheet1.

Private vstoListObject As Microsoft.Office.Tools.Excel.ListObject
Private Const DISP_E_BADINDEX As Integer = CInt(&H8002000B)

Private Sub Sheet1_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
    Dim nativeListObject As Excel.ListObject = Nothing

    Try
        nativeListObject = Me.ListObjects("MyListObject")
    Catch ex As System.Runtime.InteropServices.COMException
        ' "MyListObject" does not exist.
        If ex.ErrorCode <> DISP_E_BADINDEX Then
            Throw
        End If
    End Try

    If nativeListObject IsNot Nothing Then
        vstoListObject = Me.Controls.AddListObject(nativeListObject)
    End If
End Sub
private Microsoft.Office.Tools.Excel.ListObject vstoListObject;
private const int DISP_E_BADINDEX = unchecked((int)0x8002000B);

private void Sheet1_Startup(object sender, System.EventArgs e)
{
    Excel.ListObject nativeListObject = null;

    try
    {
        nativeListObject = this.ListObjects.get_Item("MyListObject");
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
        // "MyListObject" does not exist.
        if (ex.ErrorCode != DISP_E_BADINDEX)
            throw;
    }

    if (nativeListObject != null)
    {
        vstoListObject = this.Controls.AddListObject(nativeListObject);
    }
}

Para exemplos de nível de documento que demonstram controles dinâmicos, consulte Excel Dinâmico controles de exemplo e Exemplo de controles dinâmico do Word.

Para exemplos de nível de aplicativo que demonstram controles dinâmicos, consulte O Excel Adicionar - no exemplo de controles dinâmicos e O Word Adicionar - no exemplo de controles dinâmicos.

Re-Creating ListObjects no Excel 2003 projetos e no Excel 2007 projetos antes do SP1

O método AddListObject(ListObject) é novo para projetos do Excel 2007 no Visual Studio 2008 Serviço Pack 1 (SP1).Se você estiver usando um projeto do Excel 2007 e não tiver instalado o SP1, ou se você estiver usando um projeto do Excel 2003, você não pode usar esse método para recriar um dinâmico Microsoft.Office.Tools.Excel.ListObject.

Em vez disso, você primeiro deve excluir os nativo Microsoft.Office.Interop.Excel.ListObjecte, em seguida, refazer Criar dinâmico Microsoft.Office.Tools.Excel.ListObject usando o método AddListObject(Range, String).Para o código que demonstra isso, consulte Excel Dinâmico controles de exemplo.

Se você não excluir primeiro a nativo Microsoft.Office.Interop.Excel.ListObject, em seguida, você receberá um COMException quando você tenta recriar a Microsoft.Office.Tools.Excel.ListObject, porque o Excel não permite a criação de objetos da lista sobrepostos.

Re-Creating gráficos

Para recriar um Controlarar de host Microsoft.Office.Tools.Excel.Chart , você deve primeiro excluir o Microsoft.Office.Interop.Excel.Chartnativo e recrie o Microsoft.Office.Tools.Excel.Chart usando o AddChart(Range, String) ou AddChart(Double, Double, Double, Double, String) método.Não há nenhum Add<Controlarar classe > método que permite que você Criar um novo Microsoft.Office.Tools.Excel.Chart com base em uma existente Microsoft.Office.Interop.Excel.Chart.

Se você não excluir primeiro a nativo Microsoft.Office.Interop.Excel.Chart, em seguida, você criará um gráfico de segundo, duplicado quando você recriar o Microsoft.Office.Tools.Excel.Chart.

Persistência Windows Forms Controls in documentos

Quando um documento é salvo e, em seguida, Fechada, o Tempo de execução Ferramentas do Visual Studio para o Office automaticamente remove todos os controles Windows Forms criados dinamicamente de o documento.No entanto, o comportamento é diferente para projetos de nível de documento e o nível de aplicativo.

Em personalizações em nível de documento, os controles e seus wrappers ActiveX subjacentes (que são usados para Host os controles no documento) são removidas a Avançar vez que o documento for aberto.Não há nenhuma indicação de que os controles foram já existe.

Em nível de aplicativo Adicionar-ins, os controles são removidos, mas os wrappers ActiveX permanecem no documento.Na Avançar vez que o usuário abre o documento, os wrappers ActiveX estão Visível.No Excel, os wrappers ActiveX Exibir imagens dos controles como eles apareceram Último vez que o documento foi salvo.No Word, os wrappers do ActiveX são invisíveis, a menos que o usuário clique em sobre eles, em que maiúscminúsc eles exibir uma linha pontilhada que representa a borda dos controles.Há várias maneiras você pode remover os wrappers do ActiveX.Para obter mais informações, consulte removendo ActiveX wrappers em um Adicionar-in.

Re-Creating Windows Forms Controls Quando documentos são abertos

Você pode recriar controles Windows Forms excluídos quando o usuário reabrirá o documento.Para fazer isso, a solução deve executar as seguintes tarefas:

  1. Armazenar informações sobre o tamanho, local e o estado dos controles quando o documento for salvo ou Fechada.Uma personalização de nível de documento, você pode salvar esses dados no cache de dados no documento.Em um aplicativo-nível Adicionar - in, você pode salvar esses dados em uma parte XML Personalizar no documento.

  2. Refazer Criar os controles em um evento que é disparado quando o documento for aberto.Em projetos de nível de documento, você pode fazer isso no Sheetn_Startup ou ThisDocument_Startup manipuladores de eventos.Em projetos de nível de aplicativo, você pode fazer isso no evento manipuladores para o WorkbookOpen ou DocumentOpen eventos.

Para exemplos de nível de documento que demonstram controles dinâmicos, consulte Excel Dinâmico controles de exemplo e Exemplo de controles dinâmico do Word.

Para exemplos de nível de aplicativo, consulte O Excel Adicionar - no exemplo de controles dinâmicos e O Word Adicionar - no exemplo de controles dinâmicos.

Remover wrappers ActiveX em um Adicionar-in

Quando você Adicionar dinâmico Windows Forms controles a documentos usando um Adicionar - in, você pode impedir os wrappers do ActiveX para os controles de aparecer no documento a Avançar vez que ele for aberto das seguintes maneiras.

Removendo ActiveX wrappers quando o documento É aberto

Para remover todos os wrappers do ActiveX, chame o método GetVstoObject do Microsoft.Office.Interop.Word.Document ou Microsoft.Office.Interop.Excel.Workbook que representa o documento aberto recentemente.Por exemplo, para remover todos os wrappers do ActiveX de um documento do Word, você pode chamar o método GetVstoObject do objeto Document que é passado para o manipulador de eventos para o evento DocumentOpen.

Esse procedimento é útil quando você sabe que o documento será aberto somente em computadores que possuem o Adicionar - in instalado.Se o documento pode ser passado para outros usuários que não têm o Adicionar-in instalado, considere a remoção os controles antes de fechar o documento em vez disso.

O exemplo de código a seguir demonstra como chamar o método de GetVstoObject quando o documento é aberto.

Private Sub Application_DocumentOpen_ClearActiveXWrappers( _
    ByVal Doc As Word.Document) Handles Application.DocumentOpen
    Dim vstoDocument As Microsoft.Office.Tools.Word.Document = Doc.GetVstoObject()
End Sub
private void Application_DocumentOpen_ClearActiveXWrappers(Word.Document Doc)
{
    Microsoft.Office.Tools.Word.Document vstoDocument = Doc.GetVstoObject();
}

Embora o método GetVstoObject é usado principalmente para gerar um novo item de host em tempo de execução, esse método também desmarca todos os wrappers do ActiveX do documento a Primeiro vez que ele é chamado de um documento específico.Para obter mais informações sobre como usar o método GetVstoObject , consulte Estendendo os documentos do Word e Excel pastas de trabalho no nível de aplicativo Adicionar-ins em tempo de execução.

Anotação que se o Adicionar-in cria controles dinâmicos quando o documento é aberto, o Adicionar-in já chamará o GetVstoObject método como parte do processo para criar os controles.Você não precisará adicionar uma chamada separada para o método GetVstoObject para remover os wrappers do ActiveX nesse cenário.

Removendo os controles dinâmicos antes do documento É Fechada

O Adicionar-in pode explicitamente remover cada Controlarar dinâmico do documento antes que o documento seja Fechada.Esse procedimento é útil para documentos que podem ser passados para outros usuários que não têm o Adicionar - in instalado.

O exemplo de código a seguir demonstra como remover Tudo controles Windows Forms de um documento do Word quando o documento é Fechada.

Private Sub Application_DocumentBeforeClose(ByVal Doc As Word.Document, _
    ByRef Cancel As Boolean) Handles Application.DocumentBeforeClose

    If Doc.HasVstoObject() Then
        Dim vstoDocument As Microsoft.Office.Tools.Word.Document = _
            Doc.GetVstoObject()
        Dim controlsToRemove As System.Collections.ArrayList = _
            New System.Collections.ArrayList()

        ' Get all of the Windows Forms controls.
        For Each control As Object In vstoDocument.Controls
            If TypeOf control Is System.Windows.Forms.Control Then
                controlsToRemove.Add(control)
            End If
        Next

        ' Remove all of the Windows Forms controls from the document.
        For Each control As Object In controlsToRemove
            vstoDocument.Controls.Remove(control)
        Next
    End If
End Sub
void Application_DocumentBeforeClose(Word.Document Doc, ref bool Cancel)
{
    if (Doc.HasVstoObject())
    {
        Microsoft.Office.Tools.Word.Document vstoDocument = Doc.GetVstoObject();
        System.Collections.ArrayList controlsToRemove = 
            new System.Collections.ArrayList();

        // Get all of the Windows Forms controls.
        foreach (object control in vstoDocument.Controls)
        {
            if (control is System.Windows.Forms.Control)
            {
                controlsToRemove.Add(control);
            }
        }

        // Remove all of the Windows Forms controls from the document.
        foreach (object control in controlsToRemove)
        {
            vstoDocument.Controls.Remove(control);
        }
    }
}

Consulte também

Tarefas

Excel Dinâmico controles de exemplo

Exemplo de controles dinâmico do Word

O Excel Adicionar - no exemplo de controles dinâmicos

O Word Adicionar - no exemplo de controles dinâmicos

Conceitos

Adicionar controles a documentos do Office em tempo de execução

Métodos de auxiliar para controles de host

Métodos de auxiliar para controles Windows Forms

Date

History

Motivo

De 2008 de julho

Informações sobre o persistentes em controles dinâmicos em suplementos de nível de aplicativo Adicionados.

Alteração de recurso do SP1.