Определение значений по умолчанию для подкласса элемента управления NumericUpDown

Я создаю подкласс своих элементов управления NumericUpDown с именем xNumericUpDown, которое теперь отображается поверх панели инструментов в моей среде IDE.
Я хотел бы, чтобы мой новый элемент управления устанавливал значения по умолчанию, отличные от исходного элемента управления.
Наиболее важным будет DecimalPlaces=2, Minimal =Decimal.MinValue, Максимальное=Decimal.MaxValue и Increment=0.

Я полагаю, для этого я должен сделать правильные свойства в подклассе. Итак, я пытаюсь так:

 <DefaultValue(Decimal.MinValue), _
  Browsable(True)> _
Shadows Property Minimum() As Decimal
    Get
        Return MyBase.Minimum
    End Get
    Set(ByVal value As Decimal)
        MyBase.Minimum = value
    End Set
End Property

Но это не работает. При размещении в форме мой элемент управления имеет свойства исходного NumericUpDown.
Минимум = 0, Максимум = 100, DecimalPlaces = 0, Приращение = 1.

Как я могу получить желаемую функциональность?


person Wine Too    schedule 22.10.2013    source источник


Ответы (2)


Я не очень хорошо знаю Vb.Net, но вот С#, где вы создаете свой собственный элемент управления, присваивая свойствам значения по умолчанию.

public class MyNumericUpDown : NumericUpDown
{
    public MyNumericUpDown():base()
    {
        DecimalPlaces = 2;
        Minimum = decimal.MinValue;
        Maximum = decimal.MaxValue;
        Increment = 1;
    }
}

Как я уже сказал, я не знаю vb.Net, но я думаю, что это перевод...

Public Class MyNumericUpDown Inherits NumericUpDown
{
    Public Sub New()
    {
        MyBase.New()
        DecimalPlaces = 2
        Minimum = decimal.MinValue
        Maximum = decimal.MaxValue
        Increment = 1   
    }
}

Если вам не нужно использовать NumericUpDown с постоянными значениями по умолчанию, то создание пользовательского элемента управления не имеет смысла, и вы должны просто создавать разные объекты для каждой потребности.

    numericUpDown1 = New NumericUpDown()

    ' Set the Minimum, Maximum, and other values as needed.
    numericUpDown1.DecimalPlaces = 2
    numericUpDown1.Maximum = decimal.MaxValue
    numericUpDown1.Minimum = decimal.MinValue
    numericUpDown1.Increment = 1

Вы должны использовать только ключевое слово Shadow, чтобы скрыть реализации в базовом классе для класса, который вы производный.

person Harrison    schedule 22.10.2013
comment
Привет, Харрисон, я хорошо разбираюсь в C#. Проблема вашего примера заключается в том, что это перезаписывает настройки для ВСЕХ MyNumericUpDown при запуске программы, но не все MyNumericUpDown имеют одну и ту же цель. Я должен вводить также целые числа без десятичных знаков и разные свойства для разных ситуаций... - person Wine Too; 22.10.2013
comment
@user973238 user973238 Я думал, вы хотите создать настраиваемый элемент управления с определенными свойствами для частого использования. Если нет, то я не уверен, что вы ищете. Если у них нет ничего общего, почему бы просто не использовать базовый класс и не установить свойства по мере необходимости? - person Harrison; 23.10.2013
comment
Я пытаюсь это сделать (устанавливаю разные свойства в соответствии с конкретными потребностями) и привожу пример того, как я это делаю в своем вопросе, но проблема в том, что это не работает. Может быть, я объявляю и использую порперты некорректно? - person Wine Too; 23.10.2013
comment
@user973238 user973238 Я обновил свой ответ, чтобы, надеюсь, ответить на ваши вопросы. - person Harrison; 23.10.2013
comment
Я не знаю, это просто не работает. Я использую ключевое слово shadow в этих четырех свойствах в моем подклассе, но когда я помещаю новый myNumericUpDown в форму, значения этих свойств не те, которые я установил как ‹DefaultValue›, а те из исходного NumericUpDown... - person Wine Too; 23.10.2013

DefaultValue — это только атрибут, используемый разработчиком для определения необходимости сериализации данных (и выделения его полужирным шрифтом в PropertyGrid). В вашем коде вам все равно придется «установить» значение по умолчанию самостоятельно.

Public Class xNumericUpDown
  Inherits NumericUpDown

  Public Sub New()
    MyBase.DecimalPlaces = 3
  End Sub

  <DefaultValue(3)> _
  Public Shadows Property DecimalPlaces As Integer
    Get
      Return MyBase.DecimalPlaces
    End Get
    Set(value As Integer)
      MyBase.DecimalPlaces = value
    End Set
  End Property
End Class
person LarsTech    schedule 22.10.2013
comment
Привет, Ларс, я немного покопался в проблеме и все еще не нашел способа установить значения по умолчанию/начальные свойства для моего элемента управления. То, что вы предлагаете (в New), отличается, это набор значений для всех таких элементов управления, которые не нужны. - person Wine Too; 23.10.2013
comment
И больше! Теперь у меня минимальный набор -79228162514264337593543950335, что такое Decimal.MinValue. Когда я щелкаю правой кнопкой мыши по сетке свойств и выбираю «Сброс» для этого значения, появляется сообщение об ошибке: Объект типа «System.Single» не может быть преобразован в тип «System.Decimal», когда я пытаюсь сделать то же самое для свойства. Увеличьте это: Объект типа «Система». .Int32» нельзя преобразовать в тип «System.Decimal». Это нормально? В файле конструктора эти значения записываются как массивы из 4 целых чисел! - person Wine Too; 23.10.2013
comment
@ user973238 Я обновил пример. Надеюсь, теперь стало немного понятнее. Не уверен, что вы ожидали от Decimal.MinValue, поскольку это то, что вы указывали. Как вы понимаете, Decimal — это большое число. Что мне до сих пор неясно, так это ваш комментарий: this set values for all such controls what is not wanted. Это определение значения по умолчанию, так зачем вам значение по умолчанию в противном случае? В моем примере команда Reset будет работать правильно. Какие минимальные и максимальные значения вы хотите иметь? - person LarsTech; 23.10.2013
comment
Спасибо, Ларс, теперь кое-что прояснилось. Но, пожалуйста, попробуйте сделать свойство для Increment, Minimum или/и Maximum (или какого-либо типа Decimal) так же, как вы делаете для DecimalPlaces, которое является Integer, и вы увидите, что что-то не работает должным образом. Используя границы типа Decimal, я пытаюсь получить неограниченное количество NUD, так как позже я делаю свою собственную проверку. Мне никогда не нужны такие большие числа, но иногда мне нужна очень хорошая точность в циклических пересчетах с 10 знаками после запятой. Для этого в VB6 я должен использовать числа типа Double. В базе данных PostgreSQL я также храню такие данные в столбце с двойной точностью. - person Wine Too; 23.10.2013
comment
Что мне до сих пор неясно, так это ваш комментарий: это набор значений для всех таких элементов управления, которые не нужны. Это потому, что свойства типа Double ведут себя не так, как должны, и NUD начинает вести себя очень странно, и программа сама меняет такие значения, поэтому я плохо интерпретирую то, что происходит. - person Wine Too; 23.10.2013
comment
На самом деле, похоже, что все-таки я получил нужный функционал с вашими и Харрисонскими советами. Единственное, что я не могу сбросить эти десятичные знаки из сетки свойств в IDE, но я могу выжить. Спасибо за помощь и извините, я должен отдать баллы Харрисону, так как у вас гораздо больше, чем у него. - person Wine Too; 23.10.2013