При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан. Затем: Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз. |
Работа с элементами управления (продолжение)
В этой лекции мы рассмотрим расширенные возможности работы с элементами управления, а также отработаем создание почтовой программы Ballet.
Операция Drag-and-Drop
Операция Drag-and-Drop предназначена для перемещения и копирования объектов при помощи мыши. Выделив фрагмент текста в Microsoft Word, его можно перетащить в другой документ или в другую позицию текущего документа, нажав и затем отпустив левую кнопку мыши (рис. 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):
увеличить изображение
Рис. 3.2. Приложение DragAndDrop, перетаскивание фрагмента текста из Microsoft Word
На диске, прилагаемом к книге, вы найдете приложение DragAndDrop (Code\Glava3\ DragAndDrop).