Udostępnij za pośrednictwem


Utrwalanie formantów dynamicznych w dokumentach pakietu Office

Formanty, które są dodawane w czasie wykonywania nie są zachowywane po zapisaniu i zamknięciu dokumentu lub skoroszytu.Dokładne zachowanie różni się dla hosta formanty i Windows Forms.W obu przypadkach można dodać kod do rozwiązania ponownego tworzenia formantów, gdy użytkownik ponownie otwiera dokument.

Formanty, które można dodawać do dokumentów w czasie wykonywania są nazywane formantów dynamicznych.Aby uzyskać więcej informacji na temat formantów dynamicznych, zobacz Dodawanie formantów do dokumentów pakietu Office w czasie wykonywania.

Dotyczy: Informacje przedstawione w tym temacie dotyczą projektów na poziomie dokumentu i projektów na poziomie aplikacji dla następujących aplikacji: Excel 2013 i Excel 2010; Word 2013 i Word 2010. Aby uzyskać więcej informacji, zobacz Funkcje dostępne w aplikacji pakietu Office i typ projektu.

Utrwalanie formantów hosta w dokumencie

Gdy dokument jest zapisane, a następnie zamknięte, wszystkie formanty dynamic host są usunięte z dokumentu.Tylko podstawowe macierzystego obiekty Office pozostają za.Na przykład Microsoft.Office.Tools.Excel.ListObject hosta, formant staje się Microsoft.Office.Interop.Excel.ListObject.Macierzystego obiekty pakietu Office nie są podłączone do hosta kontroli wydarzeń, a nie mają funkcji wiązania danych formantu hosta.

Poniższa tabela zawiera listę macierzysty obiekt pakietu Office, który jest pozostawione w dokumencie dla każdego typu host control.

Typ formantu hosta

Typ macierzysty obiekt pakietu Office

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

Cc442765.collapse_all(pl-pl,VS.110).gifPonowne tworzenie dynamicznej kontroli hosta podczas otwierania dokumentów

Formanty dynamic host na miejsce istniejących formantów macierzystego można odtworzyć za każdym razem, gdy użytkownik otworzy dokument.Tworzenia formantów hosta w ten sposób, gdy dokument jest otwarty symuluje doświadczenia, że użytkownicy mogą oczekiwać.

Aby ponownie utworzyć formant hosta dla programu Word, lub Microsoft.Office.Tools.Excel.NamedRange lub Microsoft.Office.Tools.Excel.ListObject host control dla programu Excel, użyj Add<Klasa sterowania> Metoda Microsoft.Office.Tools.Excel.ControlCollection lub Microsoft.Office.Tools.Word.ControlCollection obiektu.Należy stosować metodę, która ma parametr dla obiektu macierzystego pakietu Office.

Na przykład, jeśli chcesz utworzyć Microsoft.Office.Tools.Excel.ListObject host kontrolę z istniejących native Microsoft.Office.Interop.Excel.ListObject , gdy dokument jest otwarty, należy użyć AddListObject(ListObject) metoda i przebieg w istniejących Microsoft.Office.Interop.Excel.ListObject.Poniższy przykład kodu pokazuje to w projekcie na poziomie dokumentu dla programu Excel.Kod odtwarza dynamicznego Microsoft.Office.Tools.Excel.ListObject jest oparty na istniejącym Microsoft.Office.Interop.Excel.ListObject o nazwie MyListObject w Sheet1 klasy.

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);
    }
}

Cc442765.collapse_all(pl-pl,VS.110).gifPonowne tworzenie wykresów

Do odtworzenia Microsoft.Office.Tools.Excel.Chart host control, rodzimy, musisz najpierw usunąć Microsoft.Office.Interop.Excel.Chart, a następnie odtworzyć Microsoft.Office.Tools.Excel.Chart za pomocą AddChart(Range, String) lub AddChart(Double, Double, Double, Double, String) metoda.Ma nie Add<Klasa sterowania> Metoda, która umożliwia tworzenie nowego Microsoft.Office.Tools.Excel.Chart oparty na istniejącym Microsoft.Office.Interop.Excel.Chart.

Jeśli nie usuniesz najpierw native Microsoft.Office.Interop.Excel.Chart, a następnie będzie utworzyć wykres po drugie, zduplikowane, jeśli odtworzysz Microsoft.Office.Tools.Excel.Chart.

Utrwalanie formantów Windows Forms w dokumentach

Gdy dokument jest zapisane, a następnie zamknięte, Visual Studio 2010 Tools for Office Runtime automatycznie usuwa wszystkie formanty Windows Forms dynamicznie utworzona z dokumentu.Jednak zachowanie różni się dla projektów na poziomie dokumentu i aplikacji.

W dokumencie poziom dostosowania formantów i ich podstawowej otoki ActiveX (które są używane do obsługi formantów w dokumencie) są usuwane przy następnym otwarciu dokumentu.Nie ma żadnych oznak, że kontrole były zawsze istnieje.

W poziomie aplikacji dodatki formanty są usuwane, ale otoki ActiveX, pozostają w dokumencie.Przy następnym otwarciu dokumentu, otoki ActiveX są widoczne.W programie Excel otoki ActiveX wyświetlania obrazów, kontroli, pojawiły się one podczas ostatniego zapisania dokumentu.W programie Word otoki ActiveX są niewidoczne, chyba że użytkownik kliknie je, w którym to przypadku wyświetlania linii kropkowanej, która reprezentuje obramowania formantów.Istnieje kilka sposobów usuwania opakowania ActiveX.Aby uzyskać więcej informacji, zobacz Usuwania opakowania ActiveX w dodatku.

Cc442765.collapse_all(pl-pl,VS.110).gifPonowne tworzenie kontroli Windows Forms podczas otwierania dokumentów

Usunięte formantów Windows Forms można odtworzyć, gdy użytkownik ponownie otwiera dokument.Aby to zrobić, rozwiązanie, należy wykonać następujące zadania:

  1. Przechowywane informacje o wielkości, lokalizacji i stanu kontroli, gdy dokument jest zapisywany lub zamknięte.W dostosowania poziomu dokumentu można zapisać danych do pamięci podręcznej danych w dokumencie.W poziomie aplikacji dodatek można zapisać te dane do niestandardowa część kodu XML w dokumencie.

  2. Utwórz ponownie formantów, zdarzenie jest wywoływane, gdy dokument jest otwarty.W przypadku projektów na poziomie dokumentu, można to zrobić Sheetn_Startup lub ThisDocument_Startup obsługi zdarzeń.W projektach na poziomie aplikacji, można zrobić to w przypadku obsługi dla WorkbookOpen lub DocumentOpen zdarzenia.

Cc442765.collapse_all(pl-pl,VS.110).gifUsuwanie opakowań ActiveX w dodatku

Podczas dodawania formantów dynamicznych Windows Forms do dokumentów przy użyciu dodatku, można zapobiec wyświetlaniu w dokumencie przy następnym otwarciu w następujący sposób otoki ActiveX dla formantów.

Cc442765.collapse_all(pl-pl,VS.110).gifUsunięcie otoki ActiveX, gdy dokument jest otwarty

Aby usunąć wszystkie opakowania ActiveX, należy zadzwonić GetVstoObject przez metodę elementu hosta dla Microsoft.Office.Interop.Word.Document lub Microsoft.Office.Interop.Excel.Workbook , oznaczającą nowo otwarty dokument.Na przykład, aby usunąć wszystkie opakowania ActiveX z dokumentu programu Word, można wywołać GetVstoObject przez metodę elementu hosta dla Document obiekt, który jest przekazywany do obsługi zdarzeń dla DocumentOpen zdarzenie.

Procedura ta jest przydatna, gdy wiadomo, że dokument zostanie otwarty tylko na komputerach, które mają zainstalowany dodatek.Jeśli dokument może być przekazywane do innych użytkowników, którzy nie mają zainstalowany dodatek, należy rozważyć usunięcie formantów przed zamknięciem dokumentu zamiast.

Poniższy przykład kodu pokazuje, jak wywołać GetVstoObject metodę, gdy dokument jest otwarty.

Private Sub Application_DocumentOpen_ClearActiveXWrappers( _
    ByVal Doc As Word.Document) Handles Application.DocumentOpen

    Dim vstoDocument As Document = Globals.Factory.GetVstoObject(Doc)

End Sub
private void Application_DocumentOpen_ClearActiveXWrappers(Word.Document Doc)
{
    Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject(Doc);

}

Chociaż GetVstoObject metoda jest używana głównie do wygenerowania nowego elementu hosta w czasie wykonywania, Metoda ta również czyści wszystkie opakowania ActiveX z dokumentu po raz pierwszy nazywa się do konkretnego dokumentu.Aby uzyskać więcej informacji na temat używania GetVstoObject metoda, zobacz Rozszerzanie dokumenty programu Word oraz skoroszyty programu Excel w dodatki poziomie aplikacji w czasie wykonywania.

Należy zauważyć, że jeśli dodatek tworzy formantów dynamicznych, gdy dokument jest otwarty, dodatku będzie już wywoływać GetVstoObject metoda jako część procesu tworzenia formantów.Nie trzeba dodawać oddzielnych wywołanie GetVstoObject metoda usuwania otoki ActiveX w tym scenariuszu.

Cc442765.collapse_all(pl-pl,VS.110).gifUsuwanie formantów dynamicznych, przed zamknięciem dokumentu

Dodatek można jawnie usunąć każdego dynamicznego sterowania z dokumentu przed zamknięciem dokumentu.Procedura ta jest przydatna w przypadku dokumentów, które mogą być przekazywane do innych użytkowników, którzy nie mają zainstalowany dodatek.

Poniższy przykład kodu pokazuje, jak usunąć wszystkie kontrolki Windows Forms z dokumentu programu Word, gdy dokument jest zamykany.

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

    Dim isExtended As Boolean = Globals.Factory.HasVstoObject(Doc)

    If isExtended Then

        Dim vstoDocument As Document = Globals.Factory.GetVstoObject(Doc)

        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)
{

    bool isExtended = Globals.Factory.HasVstoObject(Doc);

    if (isExtended)
    {
        Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject(Doc);


        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);
        }
    }
}

Zobacz też

Koncepcje

Dodawanie formantów do dokumentów pakietu Office w czasie wykonywania