Web-службы
Подключение Web-службы калькулятора к клиенту
- Свяжите клиента с Web-службой, добавив к проекту WinApp необходимую инфраструктуру командой Add Web Reference и щелкнув на ссылке Web services in this solution. После этого нужно выбрать Web-службу, представленную проектом CalcWebService, и щелкнуть по соответствующей гиперссылке Service
- После выбора сервиса CalcWebService кнопка Add Reference станет доступной и щелчок на ней заставит оболочку добавить к проекту WinApp еще одну инфраструктуру для вызова сервиса калькулятора. Созданные файлы будут помещены в папке Web References/localhost1 проекта WinApp
- Выделите на Form2.cs[Design] одновременно все 4 кнопки операций калькулятора и создайте для них заготовку btnClick() общего обработчика события Click, которую заполните следующим кодом
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WinApp { public partial class Form2 : Form { public Form2() { InitializeComponent(); } // Создаем объект Web-службы WinApp.localhost1.Service calcWebService = new WinApp.localhost1.Service(); double numResult; private void btnClick(object sender, EventArgs e) { double numFirst, numSecond; // Копируем текстовые поля в локальные переменные string strFirst = string.Copy(txtFirst.Text); string strSecond = string.Copy(txtSecond.Text); // Замена в строке точки символом запятой // для корректного преобразования в число int pos = strFirst.IndexOf('.'); if (pos != -1) { strFirst = strFirst.Substring(0, pos) + ',' + strFirst.Substring(pos + 1); } pos = strSecond.IndexOf('.'); if (pos != -1) { strSecond = strSecond.Substring(0, pos) + ',' + strSecond.Substring(pos + 1); } // Преобразуем текст в число для выполнения операций if (txtFirst.Text.Length > 0) numFirst = Convert.ToDouble(strFirst); else numFirst = 0.0D; if (txtSecond.Text.Length > 0) numSecond = Convert.ToDouble(strSecond); else numSecond = 0.0D; // Выполняем нужную операцию Button btn = (Button)sender;// Явное приведение типов для распознавания кнопок switch (btn.Name)// Переключатель { case "btnAdd":// Операция сложения numResult = calcWebService.Add(numFirst, numSecond); break; case "btnSubtract":// Операция вычитания numResult = calcWebService.Subtract(numFirst, numSecond); break; case "btnMultiply":// Операция умножения numResult = calcWebService.Multiply(numFirst, numSecond); break; case "btnDivide":// Операция деления // Корректность деления проверяется Web-службой numResult = calcWebService.Divide(numFirst, numSecond); break; } // Печатаем результат txtResult.Text = Convert.ToString(numResult); } } }Листинг 19.8. Код файла Form2.cs с заполненным обработчиком
Здесь мы прежде всего скопировали значения полей ввода в промежуточные текстовые переменные, используя статический метод System.String.Copy() класса String (псевдоним string ). Затем мы проверяем наличие символа "точки" в этих переменных и при обнаружении производим замену на символ "запятая" с полным формированием новой строки. Мы не можем заменить символ "на месте" в существующей строке, обратившись к нему как элементу массива, поскольку индексная форма адресации в строках существует только для чтения.
Но мы можем, сформировав новую строку справа от знака присваивания, присвоить результат вновь той же самой ссылке, которая фактически будет адресоваться к новой области памяти, а старая строка, как брошенный фрагмент памяти, будет оставлена для сборщика мусора. Операция замены точки на запятую выполняется для того, чтобы корректно преобразовать текстовое значение поля ввода в числовое, иначе генерируется исключение.
- Создайте обработчик для кнопки btnExit и заполните его кодом завершения работы клиента Web-службы простого калькулятора
private void btnExit_Click(object sender, EventArgs e) { this.Close(); }Листинг 19.9. Обработчик завершения работы формы Form2
Теперь нужно защитить поля ввода от всех символов, кроме цифр, одного знака минус и одной точки. Стрелки и клавиша Del в текстовых полях функционируют, но работу клавиши Backspace нужно учесть явно.
- Объявите в конце класса Form2 логическое поле isNumeric для отфильтровывания нецифровых символов, которые пользователь может попытаться ввести в текстовые поля
private bool isNumber = false;Листинг 19.10. Добавим логическую переменную isNumeric
- Выделите текстовое поле txtFirst и через панель Properties в режиме Events создайте обработчик для события KeyDown. Заполните обработчик так
private bool isNumber = false; private void txtFirst_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { isNumber = e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 // keyboard - основная клавиатура || e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9 // keypad - дополнительная клавиатура || e.KeyCode == Keys.Back; }Листинг 19.11. Обработчик события KeyDown для текстовых полей txtFirst и txtSecond
- Выделите текстовое поле txtFirst и через панель Properties в режиме Events создайте обработчик для события KeyPress. Заполните обработчик так
private void txtFirst_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { TextBox box = (TextBox) sender;// Явное преобразование типов switch(e.KeyChar) // Переключатель { case '-': // Разрешаем минус, если он первый if(box.Text.Length == 0) isNumber = true; break; case '.': // Точка не должна быть первой if(box.Text.Length == 0) break; // Точка не должна следовать сразу за минусом if(box.Text[0] == '-' && box.Text.Length == 1) break; // Точка должна быть одна if(box.Text.IndexOf('.') == -1) isNumber = true; // Еще не было точек break; } // Запрещаем в текстовом поле лишние символы if(!isNumber) e.Handled = true; }Листинг 19.12. Обработчик события KeyPress для полей txtFirst и txtSecond
- Выделите текстовое поле txtSecond и через панель Properties в режиме Events подключите к событиям KeyDown и KeyPress соответствующие обработчики, только что созданные для поля txtFirst. Обработчики подключите через раскрывающиеся списки полей значений
Здесь мы одни и те же обработчики используем для разных полей, поскольку необходимо выполнять одинаковые действия. Задача одна - не допускать для ввода в поля никакие другие символы, кроме цифр, одного минуса и одной точки. Возможность ввода цифр реализована для основной ( keyboard ) и дополнительной ( keypad ) частей клавиатуры. Параметр sender передает в обработчик ссылку на активное текстовое поле, вызвавшее событие редактирования.
- Назначьте стартовым проект WinApp, запустите его и проверьте функциональность простого калькулятора в Упражнении 2, фактически реализованного в Web-службе