Опубликован: 11.09.2006 | Уровень: специалист | Доступ: свободно
Лекция 3:

Работа с элементами управления (продолжение)

Аннотация: Операция Drag-and-Drop. Добавление элементов управления в режиме работы приложения. Элементы управления CheckBox, GroupBox, RadioButton, ComboBox. Проверка вводимых значений. События KeyPress и Validating элемента управления TextBox. Элемент управления ErrorProvider. Создание пользовательских (композитных) элементов управления. Элемент управления NumericUpDown. Запуск приложения в области уведомлений. Элемент управления NotifyIcon. Сохранение настроек приложения. XML-сериализация. Почтовая программа Ballet. Добавление проектов. Создание Мастера

Для работы с данной лекцией используйте примеры.

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

Операция Drag-and-Drop

Операция Drag-and-Drop предназначена для перемещения и копирования объектов при помощи мыши. Выделив фрагмент текста в Microsoft Word, его можно перетащить в другой документ или в другую позицию текущего документа, нажав и затем отпустив левую кнопку мыши (рис. 3.1).

Перетаскивание выделенного фрагмента текста

Рис. 3.1. Перетаскивание выделенного фрагмента текста

Создайте новое приложение и назовите его DragAndDrop. Расположите на форме два элемента TextBox и один RichTextBox, установив следующие значения свойств:

textBox1, свойство Значение
Name textBox1
Location 48; 16
Size 184; 20
Text Текст для перетаскивания
textBox2, свойство Значение
Name textBox2
AllowDrop True
Location 48; 64
Size 184; 20
Text Сюда можно поместить текст
richTextBox1, свойство Значение
Name richTextBox1
AllowDrop True
Dock Bottom
Location 0; 130
Text Текст для Microsoft Word

Значение True свойства AllowDrop разрешает размещение текстового фрагмента в данном элементе. Выделяем элемент textBox1, в окне Properties переключаемся на его события и дважды щелкаем в поле MouseDown. В обработчике этого события вызываем метод DoDragDrop:

private void textBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
  textBox1.DoDragDrop(textBox1.Text, DragDropEffects.Copy);
}

В качестве второго параметра метода мы передаем одно из значений перечисления DragDropEffects — здесь мы выбрали копирование текста Copy. Итак, при нажатой кнопке мыши содержимое текста первого текстового поля будет скопировано. В окне Properties второго элемента TextBox дважды щелкаем в поле события DragEnter. В обработчике этого события будем проверять соответствие представляемых данных формату String:

private void textBox2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
    {
      if (e.Data.GetDataPresent(DataFormats.StringFormat)) 
        e.Effect = DragDropEffects.Copy;
      else
        e.Effect = DragDropEffects.None;
    }

И наконец, при отпускании кнопки мыши в поле этого же элемента будет выводиться скопированный текст:

private void textBox2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
 {
   textBox2.Text = e.Data.GetData(DataFormats.StringFormat).ToString();
 }

Для реализации операции Drag-and-Drop в списке событий окна Properties элемента RichTextBox нет нужных нам событий DragDrop и DragEnter, поэтому в области Windows Form Designer generated code нам придется объявить обработчиков для этих событий:

// 
// richTextBox1
//
…
this.richTextBox1.DragDrop += new System.Windows.Forms.DragEventHandler
(this.richTextBox1_DragDrop);
this.richTextBox1.DragEnter += new System.Windows.Forms.DragEventHandle
r(this.richTextBox1_DragEnter);

Делаем проверку на соответствие формату String:

private void richTextBox1_DragEnter(object sender, 
   System.Windows.Forms.DragEventArgs e)
 {
   if (e.Data.GetDataPresent(DataFormats.Text)) 
     e.Effect = DragDropEffects.Copy;
   else
     e.Effect = DragDropEffects.None;
 }

Элемент RichTextBox может содержать текст, который нам следует не замещать, а добавлять к нему перетаскиваемый фрагмент. Поэтому обработчик события DragDrop будет немного сложнее:

private void richTextBox1_DragDrop(object sender, 
   System.Windows.Forms.DragEventArgs e)
 {
   int i;
   String s;

   // Определяем начальную позицию для текста
   i = richTextBox1.SelectionStart;
   s = richTextBox1.Text.Substring(i);
   richTextBox1.Text = richTextBox1.Text.Substring(0,i);

   // Перетаскиваем текст 
   richTextBox1.Text = richTextBox1.Text + 
  e.Data.GetData(DataFormats.Text).ToString();
   richTextBox1.Text = richTextBox1.Text + s;
 }

Запускаем приложение. Теперь можно перетаскивать текст из верхнего текстового поля в нижнее, а в элемент RichTextBox — даже фрагмент текста из Microsoft Word (рис. 3.2):

Приложение DragAndDrop, перетаскивание фрагмента текста из Microsoft Word

увеличить изображение
Рис. 3.2. Приложение DragAndDrop, перетаскивание фрагмента текста из Microsoft Word

На диске, прилагаемом к книге, вы найдете приложение DragAndDrop (Code\Glava3\ DragAndDrop).

Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/