Windows Forms Designer огорчает элемент управления со значением NULL - PullRequest
2 голосов
/ 11 сентября 2008

У меня есть «числовое текстовое поле» в C # .NET, которое является не чем иным, как производным от Textbox, с некоторой добавленной логикой, чтобы пользователь не мог вводить что-либо не числовое. В рамках этого я добавил свойство Value типа double? (или Nullable<double>). Поддерживать случай, когда пользователь ничего не вводит.

Элемент управления отлично работает при запуске, но дизайнеру Windows Forms, похоже, не очень нравится иметь с ним дело. Когда элемент управления добавляется в форму, в InitializeComponent () создается следующая строка кода:

this.numericTextBox1.Value = 1;

Помните, что 'Value' имеет тип Nullable<double>. Это вызывает следующее предупреждение всякий раз, когда я пытаюсь снова открыть форму в Designer:

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

В результате форма не может быть просмотрена в Designer, пока я вручную не удалю эту строку и не восстановлю ее - после чего она будет восстановлена, как только я сохраню любые изменения. Раздражает.

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 11 сентября 2008

Или, если вы не хотите, чтобы дизайнер вообще добавлял какой-либо код ... добавьте это в свойство.

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
2 голосов
/ 04 октября 2012

Кажется, что есть проблема в 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 в вашем классе.

0 голосов
/ 11 сентября 2008

Может ли это помочь установить атрибут DefaultValue в этом свойстве для нового Nullable (1)?

[DefaultValue(new Nullable<double>(1))]  
public double? Value ...
...