Aracılığıyla paylaş


Office Belgelerinde Dinamik Denetimleri Kalıcı Kılma

Çalışma zamanında eklenen denetimler belge veya çalışma kitabı kaydedilip kapatıldığında kalıcı olmaz.Konak kontrolleri ve Windows Forms denetimlerinde bu davranış farklıdır.Her iki durumda da, belge tekrar açıldığı zaman denetimlerin yeniden oluşturması için çözümünüze kod ekleyebilirsiniz.

Belgelere çalışma zamanında eklediğiniz denetimler dinamik denetim olarak adlandırılır.Dinamik denetimlerle ilgili daha fazla bilgi için, bkz. Office Belgelerine Çalışma Zamanında Denetim Ekleme.

Uygulama hedefi: Bu konudaki bilgiler, şu uygulamalar için belge düzeyi projeler ve uygulama düzeyi projelere yöneliktir. Excel 2013 ve Excel 2010; Word 2013 ve Word 2010. Daha fazla bilgi edinmek için, bkz. Office Uygulaması ve Proje Türüne Göre Kullanılabilir Özellikler.

Belgede Konak Kontrollerini Kalıcı Kılma

Bir belge kaydedilip ardından kapatıldığında tüm dinamik konak kontrolleri belgeden kaldırılır.Sadece temelde bulunan yerel Office nesneleri geriye kalır.Örneğin, ListObject denetimi bir ListObject'e dönüşür.Yerel Office nesneleri konak kontrolü olaylarına bağlı değildir ve konak kontrollerinin sahip olduğu veri bağlama işlevine sahip değildir.

Aşağıdaki tablo konak kontrollerinin bütün türleri için belgede geriye kalan yerel Office nesnelerini listeler.

Konak kontrolü türü

Yerel Office nesnesi türü

Chart

Chart

ListObject

ListObject

NamedRange

Range

Bookmark

Bookmark

BuildingBlockGalleryContentControl

ComboBoxContentControl

ContentControl

DatePickerContentControl

DropDownListContentControl

GroupContentControl

PictureContentControl

PlainTextContentControl

RichTextContentControl

ContentControl

Belge Açıldığında Dinamik Konak Kontrollerini Yeniden Oluşturma

Kullanıcı belgeyi her açtığında, mevcut yerel denetimlerin yerine yeniden dinamik konak kontrolleri oluşturabilirsiniz.Konak kontrollerini belge açıldığında bu şekilde oluşturma kullanıcıların umduğu deneyimi karşılayabilir.

Word'de bir konak kontrolünü ya da Excel'de bir NamedRange veya ListObject konak kontrolünü yeniden oluşturmak için ControlCollection ya da ControlCollection nesnesinin Adddenetim sınıfı yöntemini kullanın.Yerel Office nesnesi için bir parametresi olan bir yöntem kullanın.

Örneğin, belge açıldığı zaman, var olan yerel bir ListObject nesnesinden ListObject konak kontrolü oluşturmak istiyorsanız AddListObject(ListObject) yöntemini kullanın ve var olan ListObject nesnesini geçirin.Aşağıdaki örnekte, Excel için olan bir belge düzeyi projesinde bu işlem gösterilmektedir.Bu kod, Sheet1 sınıfında, var olan MyListObject adındaki ListObject'e dayanan dinamik bir ListObject nesnesini yeniden oluşturur.

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

Grafikleri Yeniden Oluşturma

Chart konak kontrolünü yeniden oluşturmak için önce yerel Chart nesnesini silmeli, ardından AddChart(Range, String) veya AddChart(Double, Double, Double, Double, String) yöntemini kullanarak Chart'ı oluşturmalısınız.Var olan Chart nesnesine dayanan yeni bir Chart yaratmanızı sağlayan bir Adddenetim sınıfı yöntemi yoktur.

İlk olarak yerel Chart nesnesini silmezseniz Chart'ı yeniden yarattığınız zaman grafiğin ikinci bir kopyasını oluşturursunuz.

Belgede Windows Forms Denetimlerini Kalıcı Kılma

Bir belge kaydedilip ardından kapatıldığında Office çalışma zamanı için Visual Studio Araçları, dinamik olarak oluşturulan tüm Windows Forms denetimlerini belgeden kaldırır.Ancak, belge düzeyi ve uygulama düzeyi projelerde bu davranış farklı şekillerdedir.

Belge düzeyi özelleştirmelerinde, denetimler ve temelindeki ActiveX sarmalıyıcıları (belge üzerinde denetimleri barındırmak için kullanılırlar) belgenin bir sonraki açılışında kaldırılır.Denetimlerin orada bir zamanlar bulunduğuna dair herhangi bir gösterge kalmaz.

Uygulama düzeyi eklentilerinde denetimler kaldırılır fakat ActiveX sarmalıyıcıları belgede kalır.Belgenin bir sonraki açılışında, ActiveX sarmalıyıcıları görünürdür.Excle'de, ActiveX sarmalıyıcıslar denetimlerin belgenin bir önceki kaydedelişindeki imgelerini görüntülerler.Word'de, ActiveX sarmalıyıcıları kullanıcı üzerlerine tıklatmazsa görünmez olup kullanıcının üzerlerine tıklattığı takdirde denetimin kenarlıklarını temsilen bir noktalı çizgi gösterir.ActiveX sarmalayıcıları birkaç değişik yolla kaldırılabilir.Daha fazla bilgi için bkz. Removing ActiveX Wrappers in an Add-in.

Belge Açıldığında Windows Forms Denetimlerini Yeniden Oluşturma

Belge tekrar açıldığı zaman silinmiş Windows Forms denetimlerini yeniden oluşturabilirsiniz.Bunun için çözümünüz şu görevleri gerçekleştirmelidir:

  1. Belge kaydedildiğinde veya kapatıldığında denetimlerin boyutu, konumu ve durumu hakkında bilgi saklama.Belge düzeyi özelleştirmelerinde bu bilgileri belgedeki veri önbelleğinde saklayabilirsiniz.Uygulama düzeyi eklentilerinde bu bilgileri belgedeki özel bir XML bölümüne saklayabilirsiniz.

  2. Belge açıldığı zaman, çıkarılan bir olayın içerisinde denetimleri yeniden oluşturma.Belge düzeyi projelerinde, bunu Sheetn_Startup veya ThisDocument_Startup olay işleyicilerinde yapabilirsiniz.Uygulama düzeyi projelerinde, bunu WorkbookOpen veya DocumentOpen olaylarının işleyicilerinde yapabilirsiniz.

Eklentiden ActiveX Sarmalıyıcılarını Kaldırma

Bir eklenti kullanarak belgeye dinamik Windows Forms denetimleri eklediğinizde, denetimlerin ActiveX sarmalıyıcılarının belgenin bir sonraki açılışında görünmesini şu yollarla önleyebilirsiniz.

Belge Açıldığında ActiveX Sarmalıyıcılarını Kaldırma

Bütün ActiveX sarmalıyıcılarını kaldırmak amacıyla, yeni açılan belgeyi temsil eden Document veya Workbook için bir konak öğesi oluşturmak üzere GetVstoObject yöntemini kullanın.Örneğin, bir Word belgesinin bütün ActiveX sarmalıyıcılarını kaldırmak amacıyla, DocumentOpen olayının olay işleyicisine geçirilen Document nesnesi için bir konak öğesi oluşturmak üzere GetVstoObject yöntemini kullanabilirsiniz.

Bu yöntem, belgenin yalnızca eklentinin yüklü olduğu bilgisayarlarda açılacağını biliyorsanız kullanışlıdır.Eğer belge bu eklentinin yüklü olmadığı diğer kullanıcılara aktarılabilirse denetimleri belgeyi kapatırken kaldırmayı göz önüne alın.

Aşağıdaki kod örneğinde, belge açıldığında GetVstoObject yönteminin nasıl çağrılcağı gösterilmiştir.

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

}

GetVstoObject yöntemi esas olarak çalışma zamanında yeni bir konak öğesi oluşturmak için kullanılsa da bu yöntem aynı zamanda belgedeki bütün ActiveX sarmalayıcılarını belgede ilk çağrılışında temizler.GetVstoObject yönteminin nasıl kullanılacağı hakkında daha fazla bilgi için bkz. Uygulama Düzeyi Eklentilerindeki Word Belgelerini ve Excel Çalışma Kitaplarını Çalışma Zamanında Genişletme.

Unutmayın ki eklentiniz eğer belge açıldığında dinamik denetim oluşturuyorsa, bu denetimleri oluşturma işleminin bir parçası olarak zaten GetVstoObject yöntemini çağıracaktır.Böyle bir durumda, ActiveX sarmalıyıcılarını kaldırmak için GetVstoObject yöntemini ayrıca çağırmanız gerekmez.

Belge Kapatılmadan Önce Dinamik Denetimleri Kaldırma

Eklentiniz, belge kapatılmadan önce, dinamik denetimlerin her birini açık bir şekilde kaldırabilir.Bu yöntem, belgenin eklentinin yüklü olmadığı bilgisayarlara aktarılma olasılığına karşı faydalıdır.

Aşağıdaki kod örneğinde, bir Word belgesi kapatıldığında bütün Window Forms denetimlerinin belgeden nasıl kaldırıldığı gösterilmiştir.

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

Ayrıca bkz.

Kavramlar

Office Belgelerine Çalışma Zamanında Denetim Ekleme