خطأ "تعذر العثور على النوع" أثناء تحميل نموذج في Windows Forms Designer

StackOverflow https://stackoverflow.com/questions/9314

سؤال

لدي تطبيق نماذج Windows .NET 2.0، والذي يستخدم بشكل مكثف ListView يتحكم.

لقد صنفت فرعيا ListView فئة في قالب SortableListView<T> فئة، لذلك يمكن أن يكون أكثر ذكاءً قليلاً فيما يتعلق بكيفية عرض الأشياء وفرزها بنفسها.

لسوء الحظ، يبدو أن هذا يعطل مصمم نماذج Visual Studio، في كل من VS2005 و2008.

يتم تجميع البرنامج وتشغيله بشكل جيد، ولكن عندما أحاول عرض النموذج الخاص به في المصمم، تظهر لي هذه الأخطاء:

  • تعذر العثور على النوع "MyApp.Controls.SortableListView".الرجاء التأكد من الإشارة إلى التجميع الذي يحتوي على هذا النوع.إذا كان هذا النوع جزءًا من مشروع التطوير الخاص بك، فتأكد من بناء المشروع بنجاح.

لا تتوفر معلومات تتبع المكدس أو خط الخطأ لهذا الخطأ

  • المتغير "listViewImages" إما غير معلن أو لم يتم تعيينه مطلقًا.

في MyApp.Main.Designer.cs السطر: عمود XYZ: 1

Call stack:
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.Error(IDesignerSerializationManager manager, String exceptionText, String helpLink)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeExpression(IDesignerSerializationManager manager, String name, CodeExpression expression)
at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement) 

سطر التعليمات البرمجية المعني هو المكان الذي تمت إضافته فعليًا إلى النموذج، وهو موجود

this.imagesTab.Controls.Add( this.listViewImages );

تم الإعلان عن listViewImages كـ

private MyApp.Controls.SortableListView<Image> listViewImages;

ويتم إنشاء مثيل له في InitializeComponent الطريقة على النحو التالي:

this.listViewImages = new MyApp.Controls.SortableListView<Image>();

كما ذكرنا سابقًا، يتم تجميع البرنامج وتشغيله بشكل مثالي، ولقد حاولت تحويل ملف SortableListView فئة إلى تجميع منفصل بحيث يمكن تجميعها بشكل منفصل، ولكن هذا لا يحدث أي فرق.

ليس لدي أي فكرة من أين نذهب من هنا.سيكون موضع تقدير أي مساعدة!

هل كانت مفيدة؟

المحلول 3

عندما أضفت عرض القائمة، هل أضفته إلى صندوق الأدوات ثم أضفته إلى النموذج؟

لا، لقد قمت بالتحرير للتو Main.Designer.cs وغيرته من System.Windows.Forms.ListView ل MyApp.Controls.SortableListView<Image>

قادني الشك في أنه قد يكون بسبب الأدوية الجنيسة إلى إيجاد حل فعليًا.

لكل فئة أحتاج إلى إنشاء SortableListView لها، قمت بتعريف "فئة كعب الروتين" مثل هذا

class ImagesListView : SortableListView<Image> { }

ثم قام Main.Designer.cs يشير الملف إلى هذه الفئات الأساسية بدلاً من SortableListView.

إنه يعمل الآن، مرحا!

ولحسن الحظ أنني قادر على القيام بذلك لأن جميع أنواعي معروفة مقدمًا، وأنا أستخدم فقط SortableListView كوسيلة للحد من تكرار التعليمات البرمجية.

نصائح أخرى

لقد حدث لي ذلك بسبب بنية x86 / x64.

نظرًا لأن Visual Studio (أداة التطوير نفسها) لا يحتوي على إصدار x64، فمن غير الممكن تحميل تحكم x64 إلى مصمم واجهة المستخدم الرسومية.

قد يكون أفضل أسلوب لذلك هو ضبط واجهة المستخدم الرسومية تحت x86، وتجميعها لـ x64 عند الضرورة.

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

using My.Other.Namespace;

إلى الجزء العلوي من ملف التعليمات البرمجية الذي أنشأه المصمم.الشيء المزعج هو أنها ظلت تذهل عندما أعاد المصمم إنشاء الصفحة.

لقد واجهت هذه المشكلة أيضًا، المتعلقة بدمج تغييرات SVN الضخمة (مع التعارضات) في ملف *.Designer.cs.كان الحل هو فتح عرض التصميم بيانياً، وتحرير عنصر التحكم (نقله إلى اليسار ثم إلى اليمين) وإعادة حفظ التصميم.تم تغيير الملف *.Designer.cs بطريقة سحرية، واختفى التحذير في التجميع التالي.

لكي تكون واضحًا، تحتاج إلى إصلاح كافة مشكلات دمج التعليمات البرمجية أولاً.هذه مجرد محاولة لإجبار VS على إعادة تحميلها.

لم يتم تثبيت التجميع الذي يحتوي على MyApp.Controls.SortableListView في GAC بأي حال من الأحوال؟

عندما أضفت عرض القائمة، هل أضفته إلى صندوق الأدوات ثم أضفته إلى النموذج؟

ربما نسيت إضافة ما يلي:

    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Release all resources used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be removed otherwise; false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    private void InitializeComponent()
    {
        // ...
        this.components = new System.ComponentModel.Container(); // Not necessarily, if You do not use
        // ...
    }

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

هذه المشاركة على MSDN اقترح أن أضيف

if (this.DesignMode) return;

إلى وظيفة التحميل الخاصة بعنصر التحكم، أو في حالتي إلى النقطة التي سبقت تهيئة عميل WCF.لقد فعلت هذه الحيلة.

لذا

private readonly Client _client = new Client();

يصبح

private Client _client;

public new void Load()
{
    if(DesignMode) return;
    _client = new Client();
}

كان لي نفس القضية.في حالتي كانت هذه المشكلة بسبب تهيئة الموارد.لقد قمت بنقل الكود التالي من InitializeComponent طريقة ctor(بعد الاتصال InitializeComponent).وبعد ذلك تم حل هذه المشكلة:

this->resources = (gcnew System::ComponentModel::ComponentResourceManager(XXX::typeid));

لقد واجهت نفس المشكلة.بعد إزالة بعض عناصر التحكم الخاصة بي في ملف *.Designer.cs، تم حل المشكلة.وبعد العودة إلى الكود الأصلي ظلت المشكلة محلولة.لذلك يبدو أن هناك مشكلة في ذاكرة التخزين المؤقت لـ Visual Sudio.في هذه اللحظة لا أستطيع إعادة إنتاج هذه المشكلة.

إذا كانت لديك المشكلة، فحاول إفراغ المجلد

C:\Users\YOURNAME\AppData\Local\Microsoft\VisualStudio\VERSION\Designer\ShadowCache

هل نجحت؟

في حالتي كانت المشكلة هي اسم المجلد الخاص بمشروعي!لماذا أعتقد هذا:أستخدم SVN وفي "trunk\SGIMovel" يعمل بشكل مثالي.ولكن في مجلد فرعي يسمى "OS#125\SGIMovel" لا يمكنني فتح المصمم لنموذج يستخدم عنصر تحكم مخصص ويعمل في مجلد صندوق الاتصال.

فقط انزل عن # ويعمل بشكل جيد.

شكرا على لاشئ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top