Sdílet prostřednictvím


Trvalý dynamické ovládací prvky v dokumentech sady Office

Ovládací prvky, které jsou přidány za běhu nepřetrvají po uložení a zavření dokumentu nebo sešitu.Přesné chování je odlišné pro ovládací prvky hostitel a model Windows Forms.V obou případech můžete přidat kód do vašeho řešení k opětovnému vytvoření ovládacích prvků, když uživatel otevře dokument.

Přidat do dokumentů za běhu ovládací prvky nazývají dynamické ovládací prvky.Další informace o dynamických ovládacích prvků, viz Přidání ovládacích prvků do dokumentů sady Office v době spuštění.

Platí pro: Informace v tomto tématu se vztahují na projekty na úrovni dokumentu i na úrovni aplikace v následujících aplikacích: Excel 2013 a Excel 2010, Word 2013 a Word 2010. Další informace naleznete v tématu Funkce aplikace Office a typ projektu.

Trvalý hostitele ovládací prvky v dokumentu

Po uložení dokumentu a zavřeny všechny ovládací prvky dynamic host jsou odebrány z dokumentu.Pouze základní nativní objekty Office zůstat za.Například Microsoft.Office.Tools.Excel.ListObject se stane hostitele Microsoft.Office.Interop.Excel.ListObject.Nativní objekty Office nejsou připojeny k události ovládacího prvku hostitele a nemají funkce datové vazby ovládacího prvku hostitele.

Následující tabulka uvádí nativní Office objekt, který je ponecháno v dokumentu pro každý typ hostitelského ovládacího prvku.

Ovládací prvek typu Host

Nativní typ objektu 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(cs-cz,VS.110).gifPři otevření dokumentů vytvořit dynamické ovládací prvky hostitele

Ovládací prvky dynamic host místo existující nativní ovládací prvky lze znovu pokaždé, když uživatel otevře dokument.Vytváření ovládacích prvků hostitele tímto způsobem při otevření dokumentu simuluje zkušenosti, které uživatelé mohou očekávat.

Pro aplikaci Word znovu vytvořit hostitelského ovládacího prvku nebo Microsoft.Office.Tools.Excel.NamedRange nebo Microsoft.Office.Tools.Excel.ListObject hostiteli ovládacího prvku v aplikaci Excel použít Add<třídy ovládacího prvku> Metoda Microsoft.Office.Tools.Excel.ControlCollection nebo Microsoft.Office.Tools.Word.ControlCollection objektu.Použijte metodu, která má parametr pro nativní objekt Office.

Například pokud chcete vytvořit Microsoft.Office.Tools.Excel.ListObject hostiteli ovládacího prvku z existující nativní Microsoft.Office.Interop.Excel.ListObject při otevření dokumentu použít AddListObject(ListObject) metoda a průchod v existující Microsoft.Office.Interop.Excel.ListObject.Následující příklad kódu ukazuje tento dokument úroveň projektu pro Excel.Kód znovu vytvoří dynamické Microsoft.Office.Tools.Excel.ListObject , je na základě existujícího Microsoft.Office.Interop.Excel.ListObject s názvem MyListObject v Sheet1 třídy.

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(cs-cz,VS.110).gifOpakovaným vytvářením grafů

Znovu vytvořit Microsoft.Office.Tools.Excel.Chart hostiteli ovládacího prvku, musíte nejprve odstranit nativní Microsoft.Office.Interop.Excel.Charta znovu Microsoft.Office.Tools.Excel.Chart pomocí AddChart(Range, String) nebo AddChart(Double, Double, Double, Double, String) metoda.Neexistuje žádný Add<třídy ovládacího prvku> Metoda, která umožňuje vytvořit nový Microsoft.Office.Tools.Excel.Chart na základě existujícího Microsoft.Office.Interop.Excel.Chart.

Pokud nejprve neodstraníte nativní Microsoft.Office.Interop.Excel.Chart, a potom vytvoříte duplicitní, druhý graf, můžete znovu vytvořit Microsoft.Office.Tools.Excel.Chart.

Trvalý model Windows Forms prvky v dokumentech

Po uložení dokumentu a pak uzavřen, Visual Studio Tools for Office runtime dynamicky vytvářených ovládacích prvků model Windows Forms automaticky odebere z dokumentu.Chování se však liší pro projekty na úrovni aplikace a úrovni dokumentu.

Úroveň dokumentu vlastní ovládací prvky a jejich podkladové obálky ActiveX (které se používají k hostování ovládacích prvků v dokumentu) budou odebrány při příštím otevření dokumentu.Neexistuje žádný náznak, že ovládací prvky byly dříve k dispozici.

V úrovni aplikace doplňky ovládací prvky jsou odebrány, ale obálky ActiveX v dokumentu zůstat.Při příštím otevření dokumentu, jsou viditelné obálky ActiveX.V aplikaci Excel zobrazit obálky ActiveX obrázky ovládacích prvků, jako při posledním uložení dokumentu.V aplikaci Word obálky ActiveX jsou neviditelné, pokud uživatel klepne na nich, v takovém případě zobrazí tečkovaná čára, která představuje ohraničení ovládacích prvků.Obálky ActiveX lze odstranit několika způsoby.Další informace naleznete v Odebrání obálky ActiveX v v.

Cc442765.collapse_all(cs-cz,VS.110).gifPři otevření dokumentů vytvořit ovládací prvky model Windows Forms

Když uživatel otevře dokument, můžete znovu vytvořit odstraněné model Windows Forms prvky.Postup řešení musí provádět následující úkoly:

  1. Při uložení nebo zavření dokumentu jsou uloženy informace o velikosti, umístění a stavu ovládacích prvků.V dokumentu úroveň přizpůsobení můžete uložit data do mezipaměti data v dokumentu.V úrovni aplikace doplněk můžete uložit tato data vlastní část XML v dokumentu.

  2. Znovu vytvořte ovládací prvky v události, která je vyvolána při otevření dokumentu.V projektech úrovni dokumentu provedete Sheetn_Startup nebo ThisDocument_Startup obslužné rutiny událostí.V projekty na úrovni aplikace, můžete provést v tomto obslužné rutiny WorkbookOpen nebo DocumentOpen události.

Cc442765.collapse_all(cs-cz,VS.110).gifOdebrání obálky ActiveX v doplňku

Po přidání dynamické ovládací prvky model Windows Forms do dokumentů pomocí doplňku můžete zabránit obálky ActiveX ovládací prvky v dokumentu zobrazeny při příštím otevření následujícími způsoby.

Cc442765.collapse_all(cs-cz,VS.110).gifOdebrání obálky ActiveX při otevření dokumentu

Odebrat všechny obálky ActiveX, zavolejte GetVstoObject metoda generovat položku hostitele Microsoft.Office.Interop.Word.Document nebo Microsoft.Office.Interop.Excel.Workbook , která představuje nově otevřený dokument.Například z dokumentu aplikace Word odebrat všechny obálky ActiveX, můžete zavolat GetVstoObject metoda generovat položku hostitele Document objekt, který je předán obslužné rutině pro DocumentOpen události.

Tento postup je užitečný, když víte, že dokument bude otevřen pouze v počítačích, které mají doplněk nainstalován.Dokument může být předán jiným uživatelům, kteří nemají doplněk nainstalován, zvažte před zavřením dokumentu namísto odebrání ovládacích prvků.

Následující příklad kódu ukazuje způsob volání GetVstoObject metoda při otevření dokumentu.

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

}

Přestože GetVstoObject metoda se používá především k běhu generovat novou položku hostitele, tato metoda odstraní také všechny obálky ActiveX z dokumentu prvním je volána pro určitý dokument.Další informace o použití GetVstoObject metoda, viz Rozšíření dokumenty aplikace Word a Excel v doplňky úroveň aplikace v době spuštění.

Pokud doplněk vytvoří dynamické ovládací prvky při otevření dokumentu, doplněk bude již volána GetVstoObject metoda jako část procesu vytváření ovládacích prvků.Není nutné přidávat samostatné volání GetVstoObject metoda odebrat obálky ActiveX v tomto scénáři.

Cc442765.collapse_all(cs-cz,VS.110).gifOdebrání dynamických ovládacích prvků před zavřením dokumentu

Doplněk můžete explicitně odebrat jednotlivé dynamické ovládací prvky z dokumentu před zavřením dokumentu.Tento postup je užitečný pro dokumenty, které může být předána ostatním uživatelům, kteří nemají doplněk nainstalován.

Následující příklad kódu ukazuje, jak odebrat všechny prvky model Windows Forms z dokumentu aplikace Word při zavření dokumentu.

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

Viz také

Koncepty

Přidání ovládacích prvků do dokumentů sady Office v době spuštění