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.
Ponowne 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);
}
}
Ponowne 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.
Ponowne 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:
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.
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.
Usuwanie 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.
Usunię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.
Usuwanie 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