Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_C#.doc
Скачиваний:
38
Добавлен:
15.11.2018
Размер:
2.72 Mб
Скачать

17.6 Работа с элементами управления в режиме работы приложения

Для добавления элементов управления во время работы приложения используется объект ControlsCollection, содержащий ряд методов. Под коллекцией элементов понимается их упорядоченная последовательность.

Метод

Описание

Add

Добавление элемента в коллекцию

AddRange

Добавление массива элементов

Clear

Удаление всех элементов из коллекции

Remove

Удаление элемента из коллекции

RemoveAt

Удаление элемента по заданному индексу

Count

Общее число элементов в коллекции

Рассмотрим пример: при нажатии на кнопку будем создавать на форме еще одну кнопку, при нажатии на созданную будем создавать еще одну кнопку и т.д. При щелчке правой кнопкой мыши по любой из кнопок, она будет удаляться.

Создайте новое приложение и назовите его AddRemoveControls. Устанавливаем свойству AutoScroll формы значение True для возможности прокрутки формы. Добавляем на форму кнопку и помещаем ее в верхний левый угол формы. В поле свойства Text кнопки вводим Clone. Переходим в обработчик кнопки:

private void button1_Click(object sender, System.EventArgs e)

{

//Создаем экземпляр btn класса Button

Button btn = new Button();

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

//добавленный на форму control

Control prev = (Control)this.Controls[this.Controls.Count-1];

//Устанавливаем позицию добавляемых кнопок

int x1 = prev.Location.X;

int y1 = prev.Location.Y;

int height = prev.Height;

int width = prev.Width;

btn.Location = new Point(x1+ width+5, y1 + height +5);

btn.Width = prev.Width;

btn.Height = prev.Height;

//Добавляем событие для новой кнопки и обработчик button1_Click

btn.Click+= new EventHandler(button1_Click);

//Устанавливаем свойство Text кнопки

btn.Text = "Clone";

//Добавляем экземпляр в коллекцию

this.Controls.Add(btn);

//Определяем обработчик для события MouseUp экземпляра кнопки btn

btn.MouseUp+= new MouseEventHandler(button1_MouseUp);

}

Переключаемся в режим дизайна формы, выделяем кнопку, в окне Properties нажимаем на кнопку событий (Events) и дважды щелкаем в поле события MouseUp:

private void button1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

{

if(e.Button==MouseButtons.Right)

{

//Удаляем данную кнопку

this.Controls.Remove((Control)sender);

}

}

Запускаем приложение. При щелчке правой кнопкой мыши на любой из кнопок добавляется еще одна, а при щелчке левой кнопкой мыши на заданной кнопке она исчезает.

17.7 Работа со списками: ListBox, ComboBox, NumericUpDown.

Перед программистом часто встает задача организации списков, предназначенных для выбора строки из некоторого заранее определенного набора строк. Например, может потребоваться список файлов из текущего каталога, список названий цветов для раскраски какого-либо объекта приложения, список режимов работы приложения и т. д. Стандартные диалоговые окна, такие как Open и Save As, содержат списки файлов, каталогов и дисковых устройств.

На панели инструментов Tools системы разработки программного обеспечения Microsoft Visual Studio .NET имеются готовые элементы управления, с помощью которых программист может легко добавить списки различных типов в свое приложение.

В левом верхнем углу этого окна находится список, созданный на базе класса ListBox. С его помощью Вы можете создавать одно-колоночные и многоколоночные списки, имеющие вертикальную (для одно-колоночных списков) и горизонтальную (для многоколоночных списков) полосу прокрутки. Список ListBox позволяет пользователю выбирать как один, так и несколько элементов.

Список, создаваемый на базе класса CheckedListBox, тоже допускает выбор одного или нескольких элементов. Этот список показан в правом верхнем углу рисунка. Он представляет собой комбинацию списка ListBox и флажков CheckBox, рассмотренных в предыдущем разделе этой главы.

Список класса ComboBox, показанный в левой части рисунка, является комбинацией списка и однострочного редактора текста. Поэтому для данного списка используются свойства и события, аналогичные свойствам и событиям списка ListBox и редактора текста класса TextBox.

В нижней части главного окна нашего приложения находятся элементы управления DomainUpDown и NumericUpDown. Первый из них позволяет выбирать текстовую строку из списка методом последовательного перебора, а второй — последовательно изменять значение числовой величины. Рассмотрим использование этих элементов управления подробнее.

Список класса ListBox. В процессе визуального проектирования приложения для создания списка ListBox программист перетаскивает значок этого списка, расположенный на инструментальной панели Toolbox. При этом в приложение будет добавлен следующий программный код:

this.listBox1 = new System.Windows.Forms.ListBox();

Здесь список создается как объект класса System.Windows.Forms.ListBox.

Сразу после создания список пуст. Редактируя свойство Items, можно добавить в список необходимое количество строк. При этом на программном уровне добавление строк будет выполнено при помощи метода AddRange:

this.listBox1.Items.AddRange( new object[]   {      "Каждый",      "Охотник",      "Желает",      "Знать",      "Где",      "Сидит",      "Фазан"   } );

Этот метод позволяет добавить в список сразу несколько строк.

Свойство SelectionMode определяет режим выделения элементов списка и может принимать следующие значения:

         SelectionMode.None;

         SelectionMode.One;

         SelectionMode.MultiSimple;

         SelectionMode.MultiExtended.

Значение SelectionMode.None запрещает выделение элементов и может быть использовано, например, для динамического блокирования списка.Если присвоить свойству SelectionMode значение SelectionMode.One, пользователь сможет выделить в списке только один элемент. Значения SelectionMode.MultiSimple и SelectionMode.MultiExtended позволяют выделять в списке сразу несколько элементов. В первом из этих случаев выделение нескольких элементов выполняется мышью или клавишей пробела, а во втором дополнительно можно использовать клавишу Shift и клавиши перемещения курсора.

При помощи свойства Sorted, присвоив ему значение true, можно включить режим сортировки строк списка, отключенный по умолчанию. Свойство MultiColumn позволяет расположить строки списка в несколько столбцов.

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

Вначале мы рассмотрим ситуацию, когда пользователю разрешается выделять из списка только один элемент. В этом случае свойству SelectionMode должно быть присвоено значение One.

В этом случае номер выделенной строки будет храниться в свойстве SelectedIndex. Самой верхней строке списка соответствует нулевое значение. Заметим, что если пользователь не выделил ни одной строки, в свойство SelectedIndex будет записано отрицательное значение.

Что же касается SelectedItem, то это свойство хранит текст строки, выделенной в списке пользователем, или пустую строку, если пользователь не выделил ни одной строки списка.

Для работы с этими свойствами создайте обработчик событий button1_Click для кнопки OK, расположенной в главном окне приложения

private void button1_Click(object sender, System.EventArgs e) {   string str;   str = "Список ListBox:";   str += "\nИндекс: " + listBox1.SelectedIndex;   str += "\nЭлемент: " + listBox1.SelectedItem;   MessageBox.Show(str); }

Этот обработчик последовательно дописывает к строке str индекс выделенной строки списка и текст этой строки, а затем отображает результат в диалоговом окне MessageBox.

Если пользователю разрешено выбирать из списка сразу несколько элементов, то программа может получить номера выделенных строк, анализируя свойство SelectedIndices. Это свойство представляет собой контейнер, содержащий список выделенных строк. Аналогично, текст выделенных строк можно извлечь из контейнера SelectedItems:

str += "\n"; foreach (int idx in listBox1.SelectedIndices) {   str += " " + idx; } str += "\n"; foreach (string s in listBox1.SelectedItems) {   str += " " + s; }

Добавьте приведенные выше строки в тело обработчика событий button1_Click непосредственно перед вызовом метода MessageBox.Show.

Заметьте, что свойства SelectedIndex и SelectedIndex при выделении нескольких строк будут содержать информацию только о первой выделенной строке.

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

После создания программа добавляет в список новые строки с помощью метода AddRange:

this.comboBox1 = new System.Windows.Forms.ComboBox(); … this.comboBox1.Items.AddRange(   new object[]   {      "Каждый",      "Охотник",      "Желает",      "Знать",      "Где",      "Сидит",      "Фазан"   } );

С помощью свойства Sorted можно отсортировать элементы списка по алфавиту, для чего нужно присвоить этому свойству значение true. Чтобы получить строку, выбранную пользователем из списка или введенную в поле редактирования элемента управления ComboBox, необходимо обратиться к свойству Text:

str += "\n\nСписок ComboBox: " + comboBox1.Text;

Элемент управления NumericUpDown. Хотя, строго говоря, элемент управления NumericUpDown и не является списком в обычном понимании этого слова, он позволяет изменять цифровые значения, «прокручивая» их в окне при помощи кнопок со стрелками.

Вот как программа создает элемент управления NumericUpDown:

this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();

Вы можете выполнить дополнительные настройки, отредактировав соответствующие свойства.

Прежде всего, при помощи свойства Hexadecimal можно переключить элемент управления NumericUpDown в режим ввода шестнадцатеричных чисел, если приравнять этому свойству значение true.

Свойство DecimalPlaces задает количество цифр после десятичной точки. Присвоив значению ThousandsSeparator значение true, можно включить режим выделения разрядов тысяч.

Величина инкремента и декремента задается свойством Increment, а минимальное и максимальное значения — при помощи свойств Minimum и Maximum, соответственно.

Для того чтобы получить текущее значение, установленное пользователем в окне элемента управления NumericUpDown, воспользуйтесь свойством Value:

str += "\nСписок NumericUpDown: " + numericUpDown1.Value;