مشاركة عبر


استمرارية عناصر التحكم الديناميكي في مستندات Office

ينطبق على

تنطبق المعلومات الموجودة في هذا الموضوع فقط على أنواع المشاريع وإصدارات Microsoft Office التالية: لمزيد من المعلومات، راجع الميزات المتوفرة بواسطة تطبيقات Office و نوع المشروع.

نوع المشروع

  • مشروعات على مستوى المستند

  • مشروعات على مستوى التطبيق

إصدار Microsoft Office

  • Excel 2007 و Excel 2010

  • Word 2007 و Word 2010

عناصر التحكم التي يتم إضافتها في وقت التشغيل لا تستمر عندما يتم حفظ و إغلاق المستند أو المصنف . يختلف السلوك الدقيق لعناصر تحكم المضيف و عناصر تحكم Windows Forms. في كلتا الحالتين، يمكنك إضافة التعليمات البرمجية إلى الحل الخاص بك لإعادة إنشاء عناصر التحكم عند إعادة فتح المستخدم للمستند.

عناصر التحكم التي تقوم بإضافتها إلى المستندات في وقت التشغيل تسمى عناصر تحكم حيوية (ديناميكية) . لمزيد من المعلومات حول عناصر التحكم الحيوية ، راجع إضافة عناصر تحكم إلى مستندات Office في وقت التشغيل.

استمرارية عناصر تحكم المضيف في المستند

عندما يتم حفظ المستند ثم إغلاقه، يتم إزالة كافة عناصر التحكم الحيوية للمضيف من المستند. تبقى فقط الكائنات الأساسية الأصلية لـ Office موجودة في الخلف. على سبيل المثال، عنصر تحكم المضيف Microsoft.Office.Tools.Excel.ListObject يصبح Microsoft.Office.Interop.Excel.ListObject. كائنات Office الأصلية غير متصلة بأحداث عنصر التحكم المضيف، و هي لا تملك وظيفة ربط البيانات الخاصة بعنصر التحكم المضيف.

يسرد الجدول التالى كائنات Office الأصلية التى تبقى فى المستند لكل نوع من عناصر تحكم المضيف.

نوع عنصر تحكم المضيف

نوع كائن 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

إعادة إنشاء عنصر تحكم المضيف الحيوي عند فتح المستندات

يمكنك إعادة إنشاء عناصر التحكم الحيوي للمضيف بدلاً من عناصر التحكم الأصلية في كل مرة يقوم فيها المستخدم بفتح المستند. إنشاء عناصر تحكم المضيف بهذه الطريقة أثناء فتح المستند، يحاكي الخبرة التي قد يتوقعها المستخدمون.

لإعادة إنشاء عنصر تحكم مضيف لـ Word أو عنصر تحكم مضيف لـ Excel Microsoft.Office.Tools.Excel.NamedRange أو Microsoft.Office.Tools.Excel.ListObject استخدم أسلوب فئة عنصر التحكم Add من الكائن Microsoft.Office.Tools.Excel.ControlCollection أو Microsoft.Office.Tools.Word.ControlCollection. استخدم الأسلوب الذي يحتوي على معلمة لكائن Office الأصلي.

على سبيل المثال، إذا كنت تريد إنشاء عنصر تحكم مضيف Microsoft.Office.Tools.Excel.ListObject من Microsoft.Office.Interop.Excel.ListObject الأصلية الموجودة أثناء فتح المستند، قم باستخدام الأسلوب AddListObject(ListObject) و قم بتمرير Microsoft.Office.Interop.Excel.ListObject الموجود إليه. يوضح مثال التعليمات البرمجية التالي هذا في المشروع على مستوى المستند لـ Excel. تقوم التعليمة البرمجية بإعادة إنشاء Microsoft.Office.Tools.Excel.ListObject حيوي يعتمد على Microsoft.Office.Interop.Excel.ListObject موجودة باسم MyListObject في الفئة Sheet1.

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

بالنسبة لنماذج على مستوى المستند تشرح عناصر التحكم الحيوي، راجع نموذج عناصر التحكم الحيوي لـ Excel و Word في نماذج تطوير Office وإرشادات تفصيلية.

للحصول على نماذج على مستوى التطبيق توضح عناصر التحكم الحيوية، راجع نماذج عناصر التحكم الحيوية الخاصة بوظائف Excel و Word الإضافية في نماذج تطوير Office وإرشادات تفصيلية.

إعادة إنشاء مخططات

لإعادة إنشاء عنصر تحكم مضيف Microsoft.Office.Tools.Excel.Chart ، يجب عليك أولاً حذف Microsoft.Office.Interop.Excel.Chart الأصلي، ثم إعادة إنشاء Microsoft.Office.Tools.Excel.Chart باستخدام الأسلوب AddChart(Range, String) أو AddChart(Double, Double, Double, Double, String) . لا يوجد أسلوب Add (أضف) < فئة عنصر التحكم > يتيح لك إنشاء Microsoft.Office.Tools.Excel.Chart جديد استناداً إلى Microsoft.Office.Interop.Excel.Chart موجود.

إذا لم تقم بحذف Microsoft.Office.Interop.Excel.Chart الأصلي أولاً، فستقوم بإنشاء مخطط مكرر ثاني عندما تقوم بإعادة إنشاء Microsoft.Office.Tools.Excel.Chart.

استمرارية عناصر تحكم Windows Forms في المستندات

عندما يتم حفظ مستند ثم إغلاقه فإن Visual Studio Tools لوقت تشغيل Office يقوم تلقائياً بإزالة كافة عناصر تحكم Windows Forms المنشأة بشكل حيوي من المستند. ومع ذلك، يختلف السلوك عن المشاريع على مستوى المستند و على مستوى التطبيق.

في التخصيصات على مستوى المستند ، يتم إزالة عناصر التحكم و برامج تضمين ActiveX الأساسية الخاصة بهم (التى يتم استخدامها لاستضافة عناصر التحكم الموجودة في المستند) في المرة التالية التي يتم فيها فتح المستند. لا توجد أي إشارة إن عناصر التحكم كانت موجودة هناك فى أي وقت مضى.

في الوظيفة الإضافية على مستوى التطبيق ، تتم إزالة عناصر التحكم ولكن تبقى برامج تضمين ActiveX في المستند. عندما يقوم المستخدم بفتح المستند في المرة القادمة ، تصبح برامج تضمين ActiveX مرئية. في Excel، تقوم برامج تضمين ActiveX بعرض صور عناصر التحكم كما ظهرت في المرة الأخيرة التي تم فيها حفظ المستند. في Word، تصبح برامج تضمين ActiveX غير مرئية ما لم ينقر المستخدم فوقها, فإنها فى هذه الحالة تعرض خطا منقطا يمثل حدود عناصر التحكم. هناك عدة طرق لإزالة برامج تضمين ActiveX. لمزيد من المعلومات، راجع إزالة برامج تضمين ActiveX في الوظيفة الإضافية .

إعادة إنشاء عناصر تحكم Windows Forms عند فتح المستندات

يمكنك إعادة إنشاء عناصر تحكم Windows Forms المحذوفة عندما يقوم المستخدم بإعادة فتح المستند. للقيام بذلك، يجب على الحل الخاص بك تنفيذ المهام التالية:

  1. تخزين معلومات حول حجم و موقع و حالة عناصر التحكم عند حفظ المستند أو إغلاقه. يمكنك في التخصيص على مستوى المستند حفظ هذه البيانات إلى ذاكرة التخزين المؤقت للبيانات في المستند. في الوظيفة الإضافية على مستوى التطبيق ، يمكنك حفظ هذه البيانات إلى جزء XML مخصص في المستند.

  2. إعادة إنشاء عناصر التحكم في حدث تم انشاؤه عند فتح المستند. في المشاريع على مستوى المستند ، يمكنك القيام بذلك في معالجات الأحداث _Startup nSheet أو ThisDocument_Startup . في المشاريع على مستوى التطبيق يمكنك إجراء هذا في معالجات الأحداث للأحداث WorkbookOpen أو DocumentOpen .

بالنسبة لنماذج على مستوى المستند تشرح عناصر التحكم الحيوي، راجع نموذج عناصر التحكم الحيوي لـ Excel و Word في نماذج تطوير Office وإرشادات تفصيلية.

للحصول على نماذج على مستوى التطبيق توضح عناصر التحكم الحيوية، راجع نماذج عناصر التحكم الحيوية الخاصة بوظائف Excel و Word الإضافية في نماذج تطوير Office وإرشادات تفصيلية.

إزالة برامج تضمين ActiveX في الوظيفة الإضافية

عندما تقوم بإضافة عناصر تحكم Windows Forms الحيوية إلى المستندات باستخدام الوظيفة الإضافية، يمكنك منع برامج تضمين ActiveX لعناصر التحكم من الظهور في المستند في المرة التالية التي يتم فيها فتحه بالطرق التالية.

إزالة برامج تضمين ActiveX عند فتح المستند

لإزالة كافة برامج تضمين ActiveX، قم باستدعاء الأسلوب GetVstoObject لإنشاء عنصر تحكم مضيف خاص بـ Microsoft.Office.Interop.Word.Document أو Microsoft.Office.Interop.Excel.Workbook يمثل المستندات المفتوحة حديثاً. على سبيل المثال، لإزالة كافة برامج تضمين ActiveX من مستند Word ، يمكنك استدعاء أسلوب GetVstoObject لإنشاء عنصر مضيف خاص بالكائن Document الذي تم تمريره إلى معالج الحدث الخاص بحدث DocumentOpen .

هذا الإجراء مفيد إذا كنت تعرف أن المستند سيتم فتحه فقط على أجهزة الكمبيوتر التي تحتوي على الوظائف الإضافية مثبتة . إذا كان المستند قد تم تمريره إلى المستخدمين الآخرين الذين ليس لديهم وظائف إضافية مثبتة،أزل عناصر التحكم قبل إغلاق المستند بدلاً من ذلك.

يوضح مثال التعليمات البرمجية التالي كيفية استدعاء الأسلوب GetVstoObject عند فتح المستند.

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 يُستخدم بشكل أساسي لإنشاء عنصر مضيف جديد وقت التشغيل ، هذا الأسلوب يقوم أيضًا بمسح كافة برامج تضمين ActiveX من المستند في المرة الأولى التي يتم استدعاؤه فيها لمستند معين. للحصول على مزيد من المعلومات حول كيفية استخدام الأسلوب GetVstoObject راجع توسيع مستندات Word ومصنفات Excel في وظائف إضافية على مستوى التطبيق في وقت التشغيل.

لاحظ أنه إذا كانت تلك الوظيفة الإضافية الخاصة تقوم بإنشاء عناصر التحكم الحيوي عند فتح المستند الخاص بك، فإن الوظيفة الإضافية الخاصة بك ستقوم بالفعل باستدعاء الأسلوب GetVstoObject كجزء من عملية إنشاء عناصر التحكم. لا تحتاج إلى إضافة استدعاء منفصل للأسلوب GetVstoObject لإزالة برامج تضمين ActiveX في هذا السيناريو.

إزالة عناصر التحكم الحيوي قبل إغلاق المستند

الوظيفة الإضافية الخاصة بك يمكنها بشكل واضح إزالة كل عنصر تحكم حيوي من المستند قبل إغلاق المستند. هذا الإجراء مفيد للمستندات التي قد يتم تمريرها إلى المستخدمين الآخرين الذين ليس لديهم وظائف إضافية مثبتة.

يوضح مثال التعليمات البرمجية التالي كيفية إزالة كافة عناصر تحكم Windows Forms من مستند Word عند إغلاق المستند.

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

راجع أيضًا:

المبادئ

إضافة عناصر تحكم إلى مستندات Office في وقت التشغيل

أساليب مساعدة لعناصر تحكم المضيف

الأساليب المساعدة لعناصر تحكم Windows Forms

موارد أخرى

نماذج تطوير Office وإرشادات تفصيلية