Конструктор Windows Forms расстроен элементом управления со свойством, допускающим значение NULL.

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

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Элемент управления работает нормально при запуске, но дизайнеру Windows Forms, похоже, не очень нравится с ним иметь дело.Когда элемент управления добавляется в форму, в 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);
    }
}

Затем вам следует применить его, используя ДизайнерСериализатор атрибут вашего класса.

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

[DefaultValue(new Nullable<double>(1))]  
public double? Value ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top