مصمم نماذج Windows مستاء من السيطرة مع nullable الملكية

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

  •  09-06-2019
  •  | 
  •  

سؤال

لدي "الرقمية مربع نص" في C# .الصافي الذي هو ليس أكثر من الاشتقاق من النص ، مع إضافة بعض المنطق إلى منع المستخدم من إدخال أي شيء غير رقمية.وكجزء من هذا ، يجب إضافة قيمة الممتلكات من نوع double? (أو Nullable<double>).إنه nullable لدعم هذه القضية حيث أن المستخدم لا يدخل أي شيء.

التحكم يعمل بشكل جيد عند تشغيل ، ولكن مصمم نماذج Windows لا يبدو أن مثل التعامل مع ذلك كثيرا.عندما تتم إضافة عنصر التحكم إلى النموذج السطر التالي من التعليمات البرمجية التي تم إنشاؤها في InitializeComponent():

this.numericTextBox1.Value = 1;

تذكر 'قيمة' من نوع Nullable<double>.هذا يولد التحذير التالية كلما أحاول فتح النموذج في المصمم:

Object of type 'System.Int32' cannot be converted to type 'System.Nullable`1[System.Double]'.

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

أي اقتراحات ؟

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

المحلول

أو إذا كنت لا تريد مصمم إضافة أي رمز على الإطلاق...هذا إضافة إلى الممتلكات.

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

نصائح أخرى

يبدو أن هناك مشكلة في Visual Studio 2008.يجب إنشاء مخصص CodeDomSerializer للتغلب على ذلك:

public class CategoricalDataPointCodeDomSerializer : CodeDomSerializer
{
    public override object Deserialize(IDesignerSerializationManager manager, object codeObject)
    {
        CodeStatementCollection collection = codeObject as CodeStatementCollection;

        if (collection != null)
        {
            foreach (CodeStatement statement in collection)
            {
                CodeAssignStatement codeAssignment = statement as CodeAssignStatement;

                if (codeAssignment != null)
                {
                    CodePropertyReferenceExpression properyRef = codeAssignment.Left as CodePropertyReferenceExpression;
                    CodePrimitiveExpression primitiveExpression = codeAssignment.Right as CodePrimitiveExpression;

                    if (properyRef != null && properyRef.PropertyName == "Value" && primitiveExpression != null && primitiveExpression.Value != null)
                    {
                        primitiveExpression.Value = Convert.ToDouble(primitiveExpression.Value);
                        break;
                    }
                }
            }
        }

        return base.Deserialize(manager, codeObject);
    }
}

ثم يجب تطبيق ذلك باستخدام DesignerSerializer السمة على الفئة الخاصة بك.

يمكن أن تساعد على تحديد السمة الافتراضية على أن المنشأة الجديدة Nullable(1)?

[DefaultValue(new Nullable<double>(1))]  
public double? Value ...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top