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. Belgeye Çalışma Zamanında Denetim Ekleme.

Uygulama alanı: Bu konudaki bilgiler şu uygulamaların belge düzeyi projelerine ve uygulama düzeyi projelerine yöneliktir: Excel 2007 ve Excel 2010; Word 2007 ve Word 2010. Daha fazla bilgi için bkz. Office Uygulamalarında Kullanılabilir Özellikler ve Proje Türü.

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, Microsoft.Office.Tools.Excel.ListObject denetimi bir Microsoft.Office.Interop.Excel.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ü

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

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 Microsoft.Office.Tools.Excel.NamedRange veya Microsoft.Office.Tools.Excel.ListObject konak kontrolünü yeniden oluşturmak için Microsoft.Office.Tools.Excel.ControlCollection ya da Microsoft.Office.Tools.Word.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 Microsoft.Office.Interop.Excel.ListObject nesnesinden Microsoft.Office.Tools.Excel.ListObject konak kontrolü oluşturmak istiyorsanız AddListObject(ListObject) yöntemini kullanın ve var olan Microsoft.Office.Interop.Excel.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 Microsoft.Office.Interop.Excel.ListObject'e dayanan dinamik bir Microsoft.Office.Tools.Excel.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

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

İlk olarak yerel Microsoft.Office.Interop.Excel.Chart nesnesini silmezseniz Microsoft.Office.Tools.Excel.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 Visual Studio Tools for Office çalışma zamanı modülü, 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 Microsoft.Office.Interop.Word.Document veya Microsoft.Office.Interop.Excel.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

    ' Use the following line of code in projects that target the .NET Framework 4.
    Dim vstoDocument As Document = Globals.Factory.GetVstoObject(Doc)

    ' In projects that target the .NET Framework 3.5, use the following line of code.
    ' Dim vstoDocument As Microsoft.Office.Tools.Word.Document = Doc.GetVstoObject()
End Sub
private void Application_DocumentOpen_ClearActiveXWrappers(Word.Document Doc)
{
    // Use the following line of code in projects that target the .NET Framework 4.
    Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject(Doc);

    // In projects that target the .NET Framework 3.5, use the following line of code.
    // Microsoft.Office.Tools.Word.Document vstoDocument = Doc.GetVstoObject();
}

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. Word Belgelerini ve Excel Çalışma Kitaplarını Çalıştırma Zamanında Uygulama Düzeyi Eklentileri İçinde 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

    ' Use the following line of code in projects that target the .NET Framework 4.
    Dim isExtended As Boolean = Globals.Factory.HasVstoObject(Doc)

    ' In projects that target the .NET Framework 3.5, use the following line of code.
    ' Dim isExtended As Boolean = Doc.HasVstoObject()

    If isExtended Then
        ' Use the following line of code in projects that target the .NET Framework 4.
        Dim vstoDocument As Document = Globals.Factory.GetVstoObject(Doc)

        ' In projects that target the .NET Framework 3.5, use the following line of code.
        ' Dim vstoDocument As Document = Doc.GetVstoObject()

        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)
{
    // Use the following line of code in projects that target the .NET Framework 4.
    bool isExtended = Globals.Factory.HasVstoObject(Doc);

    // In projects that target the .NET Framework 3.5, use the following line of code.
    // bool isExtended = Doc.HasVstoObject();

    if (isExtended)
    {
        // Use the following line of code in projects that target the .NET Framework 4.
        Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject(Doc);

        // In projects that target the .NET Framework 3.5, use the following line of code.
        // Microsoft.Office.Tools.Word.Document vstoDocument = Doc.GetVstoObject();

        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

Belgeye Çalışma Zamanında Denetim Ekleme

Ana Bilgisayar Denetimleri İçin Yardımcı Yöntemler

Windows Forms Denetimleri İçin Yardımcı Yöntemler