Sdílet prostřednictvím


Uchování dynamických ovládacích prvků v dokumentech systému 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ů Office za běhu.

Platí pro: Informace v tomto tématu se vztahují na projekty na úrovni dokumentu i na úrovni aplikace v těchto aplikacích: Excel 2013 a Excel 2010; Word 2013 a Word 2010. Další informace najdete v tématu Dostupné funkce podle aplikací systému 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 ListObject se stane hostitele 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

Chart

Chart

ListObject

ListObject

NamedRange

Range

Bookmark

Bookmark

BuildingBlockGalleryContentControl

ComboBoxContentControl

ContentControl

DatePickerContentControl

DropDownListContentControl

GroupContentControl

PictureContentControl

PlainTextContentControl

RichTextContentControl

ContentControl

Př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 NamedRange nebo ListObject hostiteli ovládacího prvku v aplikaci Excel použít Add<třídy ovládacího prvku> Metoda ControlCollection nebo ControlCollection objektu.Použijte metodu, která má parametr pro nativní objekt Office.

Například pokud chcete vytvořit ListObject hostiteli ovládacího prvku z existující nativní ListObject při otevření dokumentu použít AddListObject(ListObject) metoda a průchod v existující ListObject.Následující příklad kódu ukazuje tento dokument úroveň projektu pro Excel.Kód znovu vytvoří dynamické ListObject , je na základě existujícího 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);
    }
}

Opakovaným vytvářením grafů

Znovu vytvořit Chart hostiteli ovládacího prvku, musíte nejprve odstranit nativní Charta znovu 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ý Chart na základě existujícího Chart.

Pokud nejprve neodstraníte nativní Chart, a potom vytvoříte duplicitní, druhý graf, můžete znovu vytvořit 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.

Př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.

Odebrá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.

Odebrání obálky ActiveX při otevření dokumentu

Odebrat všechny obálky ActiveX, zavolejte GetVstoObject metoda generovat položku hostitele Document nebo 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í dokumentů aplikace Word a sešitů aplikace Excel v doplňcích na úrovni aplikace za běhu.

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.

Odebrá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ů Office za běhu