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-службе

