سؤال

خلال إعادة بيع ديون ، أضفت نوع عام المعلمة MyControl, فئة مشتقة من UserControl.لذا صفي الآن MyControl<T>.

الآن أحصل على خطأ في وقت التشغيل مشيرا إلى أن جزءا لا يتجزأ من ملف المورد MyControl`1.الموارد لا يمكن العثور على.نظرة سريعة مع .صافي عاكس يدل على أن الموارد ملف يسمى فعلا MyControl.الموارد, دون `1.

في بداية MyControl<T>.InitializeComponent الطريقة هناك ما هو هذا الخط الذي هو على الارجح واحدة مما تسبب المشاكل:

 System.ComponentModel.ComponentResourceManager resources =
    new System.ComponentModel.ComponentResourceManager(
       typeof(MyControl<>));

كيف يمكنني إجبار ComponentResourceManager استخدام الموارد جزءا لا يتجزأ من الملف MyControl.resources?طرق أخرى لحل هذه المشكلة هي أيضا موضع ترحيب.

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

المحلول

بالإضافة إلى Wim تقنية, يمكنك أيضا أن تعلن عدم قاعدة عامة تحكم له نفس الاسم مثل فئة عامة ، generic التحكم/شكل تستمد من غير عامة الفئة الأساسية.

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

// Empty stub class, must be in a different file (added as a new class, not UserControl 
// or Form template)
public class MyControl : UserControl
{
}

// Generic class
public class MyControl<T> : MyControl
{
     // ...
}

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

PS.أنا اختبرت هذا مع أشكال, ولكن يجب أن تعمل نفس الشيء مع الضوابط.

نصائح أخرى

تبين يمكنك تجاوز الموارد اسم الملف تحميل عن طريق وراثة من ComponentResourceManager مثل هذا:

   using System;
   using System.ComponentModel;

   internal class CustomComponentResourceManager : ComponentResourceManager
   {
      public CustomComponentResourceManager(Type type, string resourceName)
         : base(type)
      {
         this.BaseNameField = resourceName;
      }
   }

الآن يمكنني التأكد من أن مدير الموارد الأحمال MyControl.resources مثل هذا:

 System.ComponentModel.ComponentResourceManager resources =
    new CustomComponentResourceManager(typeof(MyControl<>), "MyControl");

يبدو أن هذا العمل.

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

على Visual Studio 2008 لدي هذا الخطأ:

النظام.ComponentModel.ComponentResourceManager الموارد = النظام الجديد.ComponentModel.ComponentResourceManager(typeof(MyControl));

باستخدام نوع عام 'WindowsFormsApplication1.UserControl1' يتطلب '1' نوع الحجج.

لاحظ أنه في حالة التعليمات البرمجية تم إنشاؤه بدون أقواس ، <>, بعد اسم الفئة.

هو أن تصبح مثيرة للاهتمام ، انظر ImageList autogenerates غير ترجمة التعليمات البرمجية في عام المستخدم التحكم.

ما قالوا:

نشرت من قبل مايكروسوفت في 7/6/2005 في 2:49 PM

هذه هي لعبة مثيرة للاهتمام علة.لقد ضربت على عامة scneario أننا لا نؤيد في مصمم نماذج Windows.ونحن لن تكون قادرة على إضافة دعم هذا في ويدبي (لي ملاحظة:Visual Studio 2008?) الإصدار.ونحن سوف تنظر في هذا الإصدار في المستقبل.كحل مؤقت يمكنك استخدام مصمم لإنشاء أي عام UserControl مع الجمهور نوع العقار ومن ثم إنشاء فئة عامة أن يرث من يمر تي في قاعدة الطبقات نوع المنشأة.

أعتقد أن هذا لا يمكن أن تحكم في Visual Studio مصمم نماذج أيضا.

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

// Non-generic name so that autogenerated resource loading code is happy
internal sealed class GridEditorForm
{
}

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

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