Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 891 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 30:

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