مصمم نماذج Windows مستاء من السيطرة مع nullable الملكية
سؤال
لدي "الرقمية مربع نص" في 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 ...