Пользователь также может изменить свойство Value
, просто указав соответствующее значение в поле. Если это значение находится в интервале между Minimum
и Maximum
, тогда свойства Value
и Text
изменятся в соответствии с введенным значением. Если новое значение выходит за рамки заданных значений, то свойство Text
отображает введенное число, а свойство Value
принимает значение, которое приписано свойству Maximum
. Чтобы запретить пользователю указывать числа в поле ввода, нужно для свойства ReadOnly
задать значение True
.
При изменении значения элемента NumericUpDown
инициируется событие ValueChanged
. Оно возникает только в том случае, если значение меняется программно или когда пользователь нажал кнопки со стрелками. При вводе числа событие не инициируется. В листинге 3.7 продемонстрирован пример использования элемента NumericUpDown
и обработки события ValueChanged
.
Листинг 3.7
private void numericUpDown1_ValueChanged(object sender, EventArgs e) {
int year = (int)this.numericUpDown1.Value;
this.lblNote.Text = "Вы выбрали " + year.ToString() + "год";
}
На рис. 3.5 показано, как функционирует элемент NumericUpDown
.
Рис. 3.5. Выбор года при помощи элемента NumericUpDown
При работе с элементом NumericUpDown
следует учитывать одну особенность его функционирования. Предположим, пользователь нажимает кнопку со стрелкой вверх, постоянно увеличивая значение счетчика на величину свойства Increment
. При достижении максимального значения, определенного в свойстве Maximum
, счетчик сохранит значение, которое не будет отображено на экране. Теперь, когда пользователь начнет уменьшать значения с помощью кнопки со стрелкой вниз, то отчет пойдет не от максимального значения, которое отображено в поле ввода, а от последнего значения перед достижением максимума.
Стоит проиллюстрировать эту ситуацию. Итак, у нас установлено текущее значение, равное 1992. Значение свойства Increment
равно 6, а максимум ограничен значением 2006. Последовательные нажатия стрелки вверх доведут значение с 1992 до 2006. Итак, максимальное значение достигнуто. Теперь надо нажать кнопку со стрелкой, направленной вниз. Казалось бы, на экране должно быть показано число 2000 (2006-6), но следует учитывать, что перед превышением максимального значения счетчик запомнил число 2004. Именно от него будет отсчитываться разница, и на экране будет отображено число 1998.
Элемент DomainUpDown
позволяет создавать счетчик с текстовым полем ввода. Этот элемент похож на элемент NumericUpDown
, а его функциональность схожа с теми возможностями, которые предоставляют ComboBox
или ListBox
. Но в элементе DomainUpDown
вместо чисел используются строки. Этот элемент очень широко применяется для построения интерфейса, так как он весьма компактен и не занимает много места на маленьком экране карманного компьютера. Следует учитывать, что пользователь не может увидеть весь список. Если свойство ReadOnly
имеет значение True
, то пользователь может выбирать только заранее заданные строки из списка. Если это свойство имеет значение False
, то пользователь сможет добавить свой текст в поле ввода. Впрочем, напечатанный текст все равно не войдет в список.
Так же как и элемент NumericUpDown
, данный элемент управления содержит текстовое поле и две кнопки со стрелками с правой стороны. Пользователь может использовать эти стрелки для прокрутки списка строк или ввести в поле свой текст, если свойство ReadOnly
имеет значение False
.
При создании объекта свойство SelectedIndex
имеет значение -1, показывающее, что ни один элемент списка пока еще не выбран. Если нужно выделить тот или иной пункт списка при загрузке элемента, то в свойстве SelectedIndex
нужно указать соответствующий порядковый номер. В листинге 3.8 приведен пример, иллюстрирующий программное добавление строк в список и методику обработки события SelectedItemChanged
.
Листинг 3.8
private void Form1_Load(object sender, System.EventArgs e) {
domainUpDown1.Items.Add("Item 1");
domainUpDown1.Items.Add("Item 2");
domainUpDown1.Items.Add("Item 3");
domainUpDown1.Items.Add("Item 4");
domainUpDown1.ReadOnly = true;
}
private void domainUpDown1_SelectedItemChanged(object sender,
System.EventArgs e) {
label1.Text = domainUpDown1.SelectedIndex.ToString();
label2.Text = domainUpDown1.Items[domainUpDown1.SelectedIndex].ToString();
Читать дальше