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

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

Форма списка сообщений MessageList.cs

Значения свойства Name элементов управления этой формы приведены на рис. 3.31.

Форма MessageList

увеличить изображение
Рис. 3.31. Форма MessageList

Полный листинг формы:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace MailApplication
{
  /// <summary>
  /// Summary description for MessageList.
  /// </summary>
  public class MessageList : System.Windows.Forms.Form
  {
    private Mail.Providers.Pop3 mail;
    private UserIdentity identity;
    private System.Windows.Forms.ListView lstViewMessages;
    private System.Windows.Forms.ColumnHeader colFrom;
    private System.Windows.Forms.ColumnHeader colSubject;
    private System.Windows.Forms.ColumnHeader colDate;
    private System.Windows.Forms.ImageList imageListIcons;
    private System.Windows.Forms.ColumnHeader colIcon;
    private System.Windows.Forms.Label lblMessagesCount;
    private System.Windows.Forms.Panel pnlPages;
    private System.ComponentModel.IContainer components;

    public MessageList()
    {
      InitializeComponent();
      
      identity = (UserIdentity)System.Threading.Thread.CurrentPrincipal.Identity;
      // Создание объекта POP3. 
      if(identity.Pop3Port == -1)
        mail = new Mail.Providers.Pop3(identity.Pop3);
      else
        mail = new Mail.Providers.Pop3(identity.Pop3, identity.Pop3Port);
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if(components != null)
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support — do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      this.components = new System.ComponentModel.Container();
      System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(MessageList));
      this.lstViewMessages = new System.Windows.Forms.ListView();
      this.colFrom = new System.Windows.Forms.ColumnHeader();
      this.colSubject = new System.Windows.Forms.ColumnHeader();
      this.colDate = new System.Windows.Forms.ColumnHeader();
      this.imageListIcons = new System.Windows.Forms.ImageList(this.components);
      this.colIcon = new System.Windows.Forms.ColumnHeader();
      this.lblMessagesCount = new System.Windows.Forms.Label();
      this.pnlPages = new System.Windows.Forms.Panel();
      this.SuspendLayout();
      // 
      // lstViewMessages
      // 
      this.lstViewMessages.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.lstViewMessages.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
                                                this.colIcon,
                                                this.colFrom,
                                                this.colSubject,
                                                this.colDate});
      this.lstViewMessages.Cursor = System.Windows.Forms.Cursors.Hand;
      this.lstViewMessages.FullRowSelect = true;
      this.lstViewMessages.GridLines = true;
      this.lstViewMessages.Location = new System.Drawing.Point(16, 40);
      this.lstViewMessages.MultiSelect = false;
      this.lstViewMessages.Name = "lstViewMessages";
      this.lstViewMessages.Size = new System.Drawing.Size(632, 352);
      this.lstViewMessages.SmallImageList = this.imageListIcons;
      this.lstViewMessages.TabIndex = 0;
      this.lstViewMessages.View = System.Windows.Forms.View.Details;
      this.lstViewMessages.Click += new System.EventHandler(this.lstViewMessages_Click);
      // 
      // colFrom
      // 
      this.colFrom.Text = "От";
      this.colFrom.Width = 177;
      // 
      // colSubject
      // 
      this.colSubject.Text = "Тема";
      this.colSubject.Width = 306;
      // 
      // colDate
      // 
      this.colDate.Text = "Дата";
      this.colDate.Width = 106;
      // 
      // imageListIcons
      // 
      this.imageListIcons.ImageSize = new System.Drawing.Size(16, 16);
      this.imageListIcons.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageListIcons.ImageStream")));
      this.imageListIcons.TransparentColor = System.Drawing.Color.Transparent;
      // 
      // colIcon
      // 
      this.colIcon.Text = "#";
      this.colIcon.Width = 39;
      // 
      // lblMessagesCount
      // 
      this.lblMessagesCount.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.lblMessagesCount.Location = new System.Drawing.Point(16, 8);
      this.lblMessagesCount.Name = "lblMessagesCount";
      this.lblMessagesCount.Size = new System.Drawing.Size(456, 23);
      this.lblMessagesCount.TabIndex = 1;
      this.lblMessagesCount.Text = "Писем в почтовом ящике: ";
      this.lblMessagesCount.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // pnlPages
      // 
      this.pnlPages.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.pnlPages.Location = new System.Drawing.Point(16, 400);
      this.pnlPages.Name = "pnlPages";
      this.pnlPages.Size = new System.Drawing.Size(632, 32);
      this.pnlPages.TabIndex = 2;
      // 
      // MessageList
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(664, 438);
      this.Controls.Add(this.pnlPages);
      this.Controls.Add(this.lblMessagesCount);
      this.Controls.Add(this.lstViewMessages);
      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
      this.Name = "MessageList";
      this.Text = "Список сообщений";
      this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
      this.Load += new System.EventHandler(this.MessageList_Load);
      this.ResumeLayout(false);

    }
    #endregion
    
    private void MessageList_Load(object sender, System.EventArgs e)
    {
      try
      {  
        // Вход в почтовый сервер.
        mail.LogIn(identity.Name, identity.Password);
        // Отображение количества сообщений.
        lblMessagesCount.Text += mail.NumberOfMessages.ToString();
        this.LoadCurrentPageMessages(1);
        this.DrawPages(1);
      }
      catch(Exception ex)
      {
        MessageBox.Show("При выполнении подключения возникла ошибка: " + ex.Message);
      }      
    }
    /// <summary>
    /// Прорисовывает листинг страниц.
    /// </summary>
    /// <param name="currentPageIndex">Номер текущей страницы.</param>
    void DrawPages(uint currentPageIndex)
    {
      // Очищаем контейнер.
      pnlPages.Controls.Clear();
      uint messagesPerPage = 20;
      uint pagesCount = (uint)(mail.NumberOfMessages / messagesPerPage);      
      // Отображаем номера существующих страниц.
      for(uint i = 1; i <= pagesCount; i++)
      {
        LinkLabel page = new LinkLabel();
        page.Text = i.ToString();
        page.Tag = i;
        page.Click += new EventHandler(page_Click);
        if(i == currentPageIndex)
          page.ForeColor = Color.Black;
        page.Size = new Size(20, 20);
        page.Location = new Point(30 * (int)i, 5);
        pnlPages.Controls.Add(page);
      }
    }
    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void page_Click(object sender, EventArgs e)
    {
      uint newPageIndex = Convert.ToUInt32(((LinkLabel)sender).Tag);
      this.LoadCurrentPageMessages(newPageIndex);
      this.DrawPages(newPageIndex);
    }

    /// <summary>
    /// Отображает сообщения текущей страницы.
    /// </summary>
    /// <param name="currentPageIndex">Номер текущей страницы.</param>
    void LoadCurrentPageMessages(uint currentPageIndex)
    {
      // Количество сообщений на странице.
      uint messagesPerPage = 20;
      // Индекс первого сообщения на странице.
      uint startIndex = mail.NumberOfMessages — messagesPerPage * currentPageIndex;
      // Индекс последнего сообщения на странице.
      uint finishIndex = startIndex + 20;
      // Загрузка заголовков сообщений.
      for(uint currentMessageIndex = startIndex + 1;
        currentMessageIndex <= finishIndex; currentMessageIndex++)
      {
        Mail.Message msg = null;        
        try
        {
          // Попытка загрузки заголовков сообщения.
          msg = mail.GetMessageHeader(currentMessageIndex, 0);
        }
        catch(Exception ex)
        {
          // Отображение возникшей ошибки.
          MessageBox.Show("При загрузке заголовков сообщения возникла ошибка. Номер сообщения: " +
            currentMessageIndex + "; Текст ошибки: " + ex.Message);
        }
        // Если возникла ошибка, то пропускаем текущее сообщение.
        if(msg == null)
          continue;
        // Отображение информации о сообщении.
        ListViewItem item = new ListViewItem(
          new string[]{currentMessageIndex.ToString(), msg.FromEmail, msg.Subject, msg.Date},
          0);
        item.Tag = currentMessageIndex;
        lstViewMessages.Items.Add(item);
      }
    }


    private void lstViewMessages_Click(object sender, System.EventArgs e)
    {
      try
      {
        // Получение номера выделенного сообщения.
        uint messageIndex = Convert.ToUInt32(lstViewMessages.SelectedItems[0].Tag);
        // Загрузка сообщения с сервера.
        Mail.Message msg = mail.GetMessage(messageIndex);
        // Отображение сообщения.
        ViewMessage messageViewer = new ViewMessage(msg);
        messageViewer.ShowDialog();
      }
      catch(Exception ex)
      {
        MessageBox.Show("Во время загрузки сообщения произошла следующая ошибка: " + ex.Message);
      }
    }

  }
}
Листинг 3.23.
Форма ввода пароля PasswordPromt.cs

Для получения почты необходимо ввести пароль к своей учетной записи. Значения свойства Name элементов управления этой формы приведены на рис. 3.32.

Форма PasswordPromt.

Рис. 3.32. Форма PasswordPromt.

Полный листинг формы:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace MailApplication
{
  /// <summary>
  /// Summary description for PasswordPromt.
  /// </summary>
  public class PasswordPromt : System.Windows.Forms.Form
  {
    private System.Windows.Forms.Label lblPassword;
    private System.Windows.Forms.TextBox txbPassword;
    private System.Windows.Forms.Button btnSubmit;
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null;

    public PasswordPromt()
    {
      //
      // Required for Windows Form Designer support
      //
      InitializeComponent();

      //
      // TODO: Add any constructor code after InitializeComponent call
      //
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if(components != null)
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support — do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(PasswordPromt));
      this.lblPassword = new System.Windows.Forms.Label();
      this.txbPassword = new System.Windows.Forms.TextBox();
      this.btnSubmit = new System.Windows.Forms.Button();
      this.SuspendLayout();
      // 
      // lblPassword
      // 
      this.lblPassword.Location = new System.Drawing.Point(16, 8);
      this.lblPassword.Name = "lblPassword";
      this.lblPassword.Size = new System.Drawing.Size(296, 23);
      this.lblPassword.TabIndex = 0;
      this.lblPassword.Text = "Введите пароль от почтового ящика";
      this.lblPassword.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // txbPassword
      // 
      this.txbPassword.Location = new System.Drawing.Point(16, 40);
      this.txbPassword.Name = "txbPassword";
      this.txbPassword.PasswordChar = '*';
      this.txbPassword.Size = new System.Drawing.Size(296, 20);
      this.txbPassword.TabIndex = 1;
      this.txbPassword.Text = "";
      // 
      // btnSubmit
      // 
      this.btnSubmit.Location = new System.Drawing.Point(240, 72);
      this.btnSubmit.Name = "btnSubmit";
      this.btnSubmit.TabIndex = 2;
      this.btnSubmit.Text = "ОК";
      this.btnSubmit.Click += new System.EventHandler(this.btnSubmit_Click);
      // 
      // PasswordPromt
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(328, 110);
      this.Controls.Add(this.btnSubmit);
      this.Controls.Add(this.txbPassword);
      this.Controls.Add(this.lblPassword);
      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
      this.MaximizeBox = false;
      this.MinimizeBox = false;
      this.Name = "PasswordPromt";
      this.Text = "Запрос пароля";
      this.ResumeLayout(false);
    }
    #endregion

    private void btnSubmit_Click(object sender, System.EventArgs e)
    {
      if(txbPassword.Text == "")
      {
        MessageBox.Show("Пароль не может быть пустым");
      }
      else
      {
        this.DialogResult = DialogResult.OK;
        ((UserIdentity)System.Threading.Thread.CurrentPrincipal.Identity).Password = txbPassword.Text;
        this.Close();
      }
    }
  }
}
Листинг 3.24.
Форма выбора пользователя selectUser.cs

Форма выбора пользователя появляется при запуске программы, она также используется для смены пользователя. Значения свойства Name элементов управления этой формы приведены на рис. 3.33:

Форма selectUser

Рис. 3.33. Форма selectUser

Полный листинг формы:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.IO;

namespace MailApplication
{
  /// <summary>
  /// Summary description for selectUser.
  /// </summary>
  public class selectUser : System.Windows.Forms.Form
  {
    public System.Windows.Forms.ListView lstViewUsers;
    private System.Windows.Forms.Button btnCancel;
    private System.Windows.Forms.Button btnSelect;
    private System.Windows.Forms.Label lblUserSelect;
    private System.Windows.Forms.ImageList imgLstUser;
    private System.Windows.Forms.ColumnHeader colUserName;
    private System.ComponentModel.IContainer components;

    public selectUser()
    {
      //
      // Required for Windows Form Designer support
      //
      InitializeComponent();

      //
      // TODO: Add any constructor code after InitializeComponent call
      //
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if(components != null)
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support — do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      this.components = new System.ComponentModel.Container();
      System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(selectUser));
      this.lstViewUsers = new System.Windows.Forms.ListView();
      this.colUserName = new System.Windows.Forms.ColumnHeader();
      this.imgLstUser = new System.Windows.Forms.ImageList(this.components);
      this.btnCancel = new System.Windows.Forms.Button();
      this.btnSelect = new System.Windows.Forms.Button();
      this.lblUserSelect = new System.Windows.Forms.Label();
      this.SuspendLayout();
      // 
      // lstViewUsers
      // 
      this.lstViewUsers.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
                                               this.colUserName});
      this.lstViewUsers.Cursor = System.Windows.Forms.Cursors.Hand;
      this.lstViewUsers.GridLines = true;
      this.lstViewUsers.Location = new System.Drawing.Point(8, 40);
      this.lstViewUsers.MultiSelect = false;
      this.lstViewUsers.Name = "lstViewUsers";
      this.lstViewUsers.Size = new System.Drawing.Size(272, 176);
      this.lstViewUsers.SmallImageList = this.imgLstUser;
      this.lstViewUsers.TabIndex = 0;
      this.lstViewUsers.View = System.Windows.Forms.View.Details;
      // 
      // colUserName
      // 
      this.colUserName.Text = "Имя пользователя";
      this.colUserName.Width = 268;
      // 
      // imgLstUser
      // 
      this.imgLstUser.ImageSize = new System.Drawing.Size(16, 16);
      this.imgLstUser.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgLstUser.ImageStream")));
      this.imgLstUser.TransparentColor = System.Drawing.Color.Transparent;
      // 
      // btnCancel
      // 
      this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
      this.btnCancel.Location = new System.Drawing.Point(200, 232);
      this.btnCancel.Name = "btnCancel";
      this.btnCancel.TabIndex = 1;
      this.btnCancel.Text = "Отмена";
      this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
      // 
      // btnSelect
      // 
      this.btnSelect.Location = new System.Drawing.Point(128, 232);
      this.btnSelect.Name = "btnSelect";
      this.btnSelect.TabIndex = 2;
      this.btnSelect.Text = "Выбор";
      this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click);
      // 
      // lblUserSelect
      // 
      this.lblUserSelect.Location = new System.Drawing.Point(8, 8);
      this.lblUserSelect.Name = "lblUserSelect";
      this.lblUserSelect.Size = new System.Drawing.Size(272, 23);
      this.lblUserSelect.TabIndex = 3;
      this.lblUserSelect.Text = "Выберите пользователя из списка:";
      this.lblUserSelect.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // selectUser
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.CancelButton = this.btnCancel;
      this.ClientSize = new System.Drawing.Size(292, 266);
      this.Controls.Add(this.lblUserSelect);
      this.Controls.Add(this.btnSelect);
      this.Controls.Add(this.btnCancel);
      this.Controls.Add(this.lstViewUsers);
      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
      this.Name = "selectUser";
      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
      this.Text = "Выбор пользователя";
      this.Load += new System.EventHandler(this.selectUser_Load);
      this.ResumeLayout(false);

    }
    #endregion

    private void selectUser_Load(object sender, System.EventArgs e)
    {
      DirectoryInfo dir = new DirectoryInfo(Environment.CurrentDirectory);
      FileInfo[] users = dir.GetFiles("*.usr");      
      foreach(FileInfo user in users)
      {
        ListViewItem item = new ListViewItem(user.Name, 0);
        lstViewUsers.Items.Add(item);
      }
    }

    private void btnSelect_Click(object sender, System.EventArgs e)
    {
      if(lstViewUsers.SelectedItems.Count == 0)
        MessageBox.Show("Выберите пользователя для начала работы", "Пользователь не выбран");
      else
      {
        this.DialogResult = DialogResult.OK;
        this.Close();
      }
    }

    private void btnCancel_Click(object sender, System.EventArgs e)
    {
      this.Close();
    }
  }
}
Листинг 3.25.
Форма отправки сообщений SendMessage.cs

На этой форме подготавливается сообщение к отправке. Значения свойства Name элементов управления приведены на рис. 3.34.

Форма SendMessage

увеличить изображение
Рис. 3.34. Форма SendMessage

Полный листинг формы:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Web.Mail;
using System.Threading;

namespace MailApplication
{
  /// <summary>
  /// Summary description for SendMessage.
  /// </summary>
  public class SendMessage : System.Windows.Forms.Form
  {
    private MailMessage message;
    private System.Windows.Forms.Label lblTo;
    private System.Windows.Forms.TextBox txbTo;
    private System.Windows.Forms.TextBox txbCopy;
    private System.Windows.Forms.Label lblCopy;
    private System.Windows.Forms.TextBox txbBlindCopy;
    private System.Windows.Forms.Label lblBlindCopy;
    private System.Windows.Forms.TextBox txbSubject;
    private System.Windows.Forms.Label lblSubject;
    private System.Windows.Forms.TextBox txbBody;
    private System.Windows.Forms.Label lblBody;
    private System.Windows.Forms.Button btnSend;
    private System.Windows.Forms.Panel pblAttachments;
    private System.Windows.Forms.Label lblAttachments;
    private System.Windows.Forms.Button btnAddAttach;
    private System.Windows.Forms.Button btnViewAttach;
    private System.Windows.Forms.TextBox txbAttach;
    private System.Windows.Forms.Label lblAttachNumber;
    private System.Windows.Forms.OpenFileDialog oFDAttach;
    private System.Windows.Forms.ContextMenu contextMenuDeleteAttach;
    private System.Windows.Forms.MenuItem itemDeleteAttach;
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null;

    public SendMessage()
    {
      InitializeComponent();
      message = new MailMessage();
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if(components != null)
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support — do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(SendMessage));
      this.lblTo = new System.Windows.Forms.Label();
      this.txbTo = new System.Windows.Forms.TextBox();
      this.txbCopy = new System.Windows.Forms.TextBox();
      this.lblCopy = new System.Windows.Forms.Label();
      this.txbBlindCopy = new System.Windows.Forms.TextBox();
      this.lblBlindCopy = new System.Windows.Forms.Label();
      this.txbSubject = new System.Windows.Forms.TextBox();
      this.lblSubject = new System.Windows.Forms.Label();
      this.txbBody = new System.Windows.Forms.TextBox();
      this.lblBody = new System.Windows.Forms.Label();
      this.btnSend = new System.Windows.Forms.Button();
      this.pblAttachments = new System.Windows.Forms.Panel();
      this.lblAttachments = new System.Windows.Forms.Label();
      this.btnAddAttach = new System.Windows.Forms.Button();
      this.btnViewAttach = new System.Windows.Forms.Button();
      this.txbAttach = new System.Windows.Forms.TextBox();
      this.lblAttachNumber = new System.Windows.Forms.Label();
      this.oFDAttach = new System.Windows.Forms.OpenFileDialog();
      this.contextMenuDeleteAttach = new System.Windows.Forms.ContextMenu();
      this.itemDeleteAttach = new System.Windows.Forms.MenuItem();
      this.SuspendLayout();
      // 
      // lblTo
      // 
      this.lblTo.Location = new System.Drawing.Point(32, 16);
      this.lblTo.Name = "lblTo";
      this.lblTo.Size = new System.Drawing.Size(56, 23);
      this.lblTo.TabIndex = 0;
      this.lblTo.Text = "Кому:";
      this.lblTo.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // txbTo
      // 
      this.txbTo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.txbTo.Location = new System.Drawing.Point(112, 16);
      this.txbTo.Name = "txbTo";
      this.txbTo.Size = new System.Drawing.Size(560, 20);
      this.txbTo.TabIndex = 1;
      this.txbTo.Text = "";
      // 
      // txbCopy
      // 
      this.txbCopy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.txbCopy.Location = new System.Drawing.Point(112, 48);
      this.txbCopy.Name = "txbCopy";
      this.txbCopy.Size = new System.Drawing.Size(560, 20);
      this.txbCopy.TabIndex = 3;
      this.txbCopy.Text = "";
      // 
      // lblCopy
      // 
      this.lblCopy.Location = new System.Drawing.Point(32, 48);
      this.lblCopy.Name = "lblCopy";
      this.lblCopy.Size = new System.Drawing.Size(56, 23);
      this.lblCopy.TabIndex = 2;
      this.lblCopy.Text = "Копия:";
      this.lblCopy.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // txbBlindCopy
      // 
      this.txbBlindCopy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.txbBlindCopy.Location = new System.Drawing.Point(112, 80);
      this.txbBlindCopy.Name = "txbBlindCopy";
      this.txbBlindCopy.Size = new System.Drawing.Size(560, 20);
      this.txbBlindCopy.TabIndex = 5;
      this.txbBlindCopy.Text = "";
      // 
      // lblBlindCopy
      // 
      this.lblBlindCopy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.lblBlindCopy.Location = new System.Drawing.Point(8, 80);
      this.lblBlindCopy.Name = "lblBlindCopy";
      this.lblBlindCopy.Size = new System.Drawing.Size(88, 23);
      this.lblBlindCopy.TabIndex = 4;
      this.lblBlindCopy.Text = "Скрытая копия:";
      this.lblBlindCopy.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // txbSubject
      // 
      this.txbSubject.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.txbSubject.Location = new System.Drawing.Point(112, 112);
      this.txbSubject.Name = "txbSubject";
      this.txbSubject.Size = new System.Drawing.Size(560, 20);
      this.txbSubject.TabIndex = 7;
      this.txbSubject.Text = "";
      // 
      // lblSubject
      // 
      this.lblSubject.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.lblSubject.Location = new System.Drawing.Point(32, 112);
      this.lblSubject.Name = "lblSubject";
      this.lblSubject.Size = new System.Drawing.Size(72, 23);
      this.lblSubject.TabIndex = 6;
      this.lblSubject.Text = "Тема:";
      this.lblSubject.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // txbBody
      // 
      this.txbBody.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.txbBody.Location = new System.Drawing.Point(16, 168);
      this.txbBody.Multiline = true;
      this.txbBody.Name = "txbBody";
      this.txbBody.Size = new System.Drawing.Size(712, 192);
      this.txbBody.TabIndex = 9;
      this.txbBody.Text = "";
      // 
      // lblBody
      // 
      this.lblBody.Location = new System.Drawing.Point(16, 144);
      this.lblBody.Name = "lblBody";
      this.lblBody.TabIndex = 8;
      this.lblBody.Text = "Текст сообщения:";
      this.lblBody.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // btnSend
      // 
      this.btnSend.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
      this.btnSend.Location = new System.Drawing.Point(648, 440);
      this.btnSend.Name = "btnSend";
      this.btnSend.TabIndex = 10;
      this.btnSend.Text = "Отправить";
      this.btnSend.Click += new System.EventHandler(this.btnSend_Click);
      // 
      // pblAttachments
      // 
      this.pblAttachments.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
        | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.pblAttachments.AutoScroll = true;
      this.pblAttachments.Location = new System.Drawing.Point(16, 416);
      this.pblAttachments.Name = "pblAttachments";
      this.pblAttachments.Size = new System.Drawing.Size(608, 56);
      this.pblAttachments.TabIndex = 12;
      // 
      // lblAttachments
      // 
      this.lblAttachments.Location = new System.Drawing.Point(16, 368);
      this.lblAttachments.Name = "lblAttachments";
      this.lblAttachments.Size = new System.Drawing.Size(64, 23);
      this.lblAttachments.TabIndex = 13;
      this.lblAttachments.Text = "Вложения:";
      this.lblAttachments.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // btnAddAttach
      // 
      this.btnAddAttach.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
      this.btnAddAttach.Location = new System.Drawing.Point(648, 368);
      this.btnAddAttach.Name = "btnAddAttach";
      this.btnAddAttach.TabIndex = 17;
      this.btnAddAttach.Text = "Добавить";
      this.btnAddAttach.Click += new System.EventHandler(this.btnAddAttach_Click);
      // 
      // btnViewAttach
      // 
      this.btnViewAttach.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
      this.btnViewAttach.Location = new System.Drawing.Point(568, 368);
      this.btnViewAttach.Name = "btnViewAttach";
      this.btnViewAttach.TabIndex = 16;
      this.btnViewAttach.Text = "Обзор";
      this.btnViewAttach.Click += new System.EventHandler(this.btnViewAttach_Click);
      // 
      // txbAttach
      // 
      this.txbAttach.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.txbAttach.Location = new System.Drawing.Point(176, 368);
      this.txbAttach.Name = "txbAttach";
      this.txbAttach.Size = new System.Drawing.Size(384, 20);
      this.txbAttach.TabIndex = 15;
      this.txbAttach.Text = "";
      // 
      // lblAttachNumber
      // 
      this.lblAttachNumber.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.lblAttachNumber.Location = new System.Drawing.Point(120, 368);
      this.lblAttachNumber.Name = "lblAttachNumber";
      this.lblAttachNumber.Size = new System.Drawing.Size(48, 23);
      this.lblAttachNumber.TabIndex = 14;
      this.lblAttachNumber.Text = "#";
      this.lblAttachNumber.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // oFDAttach
      // 
      this.oFDAttach.Title = "Выбор вложения";
      // 
      // contextMenuDeleteAttach
      // 
      this.contextMenuDeleteAttach.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                  this.itemDeleteAttach});
      // 
      // itemDeleteAttach
      // 
      this.itemDeleteAttach.Index = 0;
      this.itemDeleteAttach.Text = "Удалить";
      this.itemDeleteAttach.Click += new System.EventHandler(this.itemDeleteAttach_Click);
      // 
      // SendMessage
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(744, 478);
      this.Controls.Add(this.btnAddAttach);
      this.Controls.Add(this.btnViewAttach);
      this.Controls.Add(this.txbAttach);
      this.Controls.Add(this.txbBody);
      this.Controls.Add(this.txbSubject);
      this.Controls.Add(this.txbBlindCopy);
      this.Controls.Add(this.txbCopy);
      this.Controls.Add(this.txbTo);
      this.Controls.Add(this.lblAttachNumber);
      this.Controls.Add(this.lblAttachments);
      this.Controls.Add(this.pblAttachments);
      this.Controls.Add(this.btnSend);
      this.Controls.Add(this.lblBody);
      this.Controls.Add(this.lblSubject);
      this.Controls.Add(this.lblBlindCopy);
      this.Controls.Add(this.lblCopy);
      this.Controls.Add(this.lblTo);
      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
      this.Name = "SendMessage";
      this.Text = "Отправка сообщения";
      this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
      this.ResumeLayout(false);

    }
    #endregion

    private void btnViewAttach_Click(object sender, System.EventArgs e)
    {
      if(oFDAttach.ShowDialog() != DialogResult.OK)
        return;
      txbAttach.Text = oFDAttach.FileName;      
    }

    private void btnAddAttach_Click(object sender, System.EventArgs e)
    {
      MailAttachment attach = new MailAttachment(oFDAttach.FileName);
      message.Attachments.Add(attach);
      txbAttach.Text = "";
      oFDAttach.FileName = String.Empty;
      this.AddAttachmentsToPanel();
    }

    private void AddAttachmentsToPanel()
    {
      pblAttachments.Controls.Clear();
      for(int i = message.Attachments.Count -1; i >= 0; i--)
      {
        MailAttachment attach = (MailAttachment)message.Attachments[i];
        Label lblNumber = new Label();
        Label lblAttachName = new Label();
        lblNumber.Text = String.Format("#{0}", i + 1);
        lblAttachName.Text = attach.Filename;
        lblAttachName.TextAlign = lblNumber.TextAlign = ContentAlignment.MiddleLeft;
        lblAttachName.Anchor = lblNumber.Anchor = AnchorStyles.Top | AnchorStyles.Left;
                lblNumber.Location = new Point(15, i*25);
        lblAttachName.Location = new Point(50, i*25);
        lblNumber.Size = new Size(20, 20);
        lblAttachName.Size = new Size(500, 20);
        lblNumber.ContextMenu = lblAttachName.ContextMenu = contextMenuDeleteAttach;
        lblNumber.Tag = lblAttachName.Tag = i;
        pblAttachments.Controls.Add(lblNumber);
        pblAttachments.Controls.Add(lblAttachName);
      }
    }

    private void itemDeleteAttach_Click(object sender, System.EventArgs e)
    {
      MenuItem item = (MenuItem)sender;
      ContextMenu menu = (ContextMenu)item.Parent;
      Label source = (Label)menu.SourceControl;
      object o = source.Tag;
      int i = Int32.Parse(o.ToString());
      message.Attachments.RemoveAt(i);
      this.AddAttachmentsToPanel();
    }

    private void btnSend_Click(object sender, System.EventArgs e)
    {
      message.BodyFormat = MailFormat.Text;
      message.Body = txbBody.Text;
      message.Cc = txbCopy.Text;
      message.Bcc = txbBlindCopy.Text;
      message.Subject = txbSubject.Text;
      message.To = txbTo.Text;
      message.From = ((UserIdentity)Thread.CurrentPrincipal.Identity).Mail;
      Mail.MailSender mailSender = new Mail.MailSender(((UserIdentity)Thread.CurrentPrincipal.Identity).Smtp);
      mailSender.Send(message, ((UserIdentity)Thread.CurrentPrincipal.Identity).Password);
      MessageBox.Show("Ваше сообщение отправлено.");
      this.Close();
    }
  }
}
Листинг 3.26.
Форма просмотра сообщений ViewMessage.cs

В эту форму загружается сообщение для чтения при его выборе из списка формы MessageList. Значения свойства Name элементов управления приведены на рис. 3.35.

Форма ViewMessage

увеличить изображение
Рис. 3.35. Форма ViewMessage

Полный листинг формы:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace MailApplication
{
  /// <summary>
  /// Summary description for ViewMessage.
  /// </summary>
  public class ViewMessage : System.Windows.Forms.Form
  {
    /// <summary>
    /// Required designer variable.
    /// </summary>    
    private System.ComponentModel.Container components = null;
    
    private System.Windows.Forms.Label lblAttachments;
    private System.Windows.Forms.Panel pblAttachments;
    private System.Windows.Forms.Label lblBody;
    private System.Windows.Forms.Label lblSubject;
    private System.Windows.Forms.Label lblCopy;
    private System.Windows.Forms.Label lblMessageBody;
    private System.Windows.Forms.Label lblFrom;
    private Mail.Message message;

    public ViewMessage(Mail.Message msg)
    {
      //
      // Required for Windows Form Designer support
      //
      InitializeComponent();

      this.message = msg;
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if(components != null)
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(ViewMessage));
      this.lblAttachments = new System.Windows.Forms.Label();
      this.pblAttachments = new System.Windows.Forms.Panel();
      this.lblBody = new System.Windows.Forms.Label();
      this.lblSubject = new System.Windows.Forms.Label();
      this.lblCopy = new System.Windows.Forms.Label();
      this.lblFrom = new System.Windows.Forms.Label();
      this.lblMessageBody = new System.Windows.Forms.Label();
      this.SuspendLayout();
      // 
      // lblAttachments
      // 
      this.lblAttachments.Location = new System.Drawing.Point(24, 280);
      this.lblAttachments.Name = "lblAttachments";
      this.lblAttachments.Size = new System.Drawing.Size(64, 23);
      this.lblAttachments.TabIndex = 29;
      this.lblAttachments.Text = "Вложения:";
      this.lblAttachments.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // pblAttachments
      // 
      this.pblAttachments.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
        | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.pblAttachments.AutoScroll = true;
      this.pblAttachments.Location = new System.Drawing.Point(128, 280);
      this.pblAttachments.Name = "pblAttachments";
      this.pblAttachments.Size = new System.Drawing.Size(544, 178);
      this.pblAttachments.TabIndex = 28;
      // 
      // lblBody
      // 
      this.lblBody.Location = new System.Drawing.Point(24, 96);
      this.lblBody.Name = "lblBody";
      this.lblBody.TabIndex = 26;
      this.lblBody.Text = "Текст сообщения:";
      this.lblBody.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // lblSubject
      // 
      this.lblSubject.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.lblSubject.AutoSize = true;
      this.lblSubject.Location = new System.Drawing.Point(352, 16);
      this.lblSubject.Name = "lblSubject";
      this.lblSubject.Size = new System.Drawing.Size(35, 16);
      this.lblSubject.TabIndex = 24;
      this.lblSubject.Text = "Тема:";
      this.lblSubject.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // lblCopy
      // 
      this.lblCopy.AutoSize = true;
      this.lblCopy.Location = new System.Drawing.Point(24, 56);
      this.lblCopy.Name = "lblCopy";
      this.lblCopy.Size = new System.Drawing.Size(40, 16);
      this.lblCopy.TabIndex = 20;
      this.lblCopy.Text = "Копия:";
      this.lblCopy.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // lblFrom
      // 
      this.lblFrom.AutoSize = true;
      this.lblFrom.Location = new System.Drawing.Point(24, 24);
      this.lblFrom.Name = "lblFrom";
      this.lblFrom.Size = new System.Drawing.Size(47, 16);
      this.lblFrom.TabIndex = 18;
      this.lblFrom.Text = "От кого:";
      this.lblFrom.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
      // 
      // lblMessageBody
      // 
      this.lblMessageBody.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
        | System.Windows.Forms.AnchorStyles.Right)));
      this.lblMessageBody.Location = new System.Drawing.Point(136, 96);
      this.lblMessageBody.Name = "lblMessageBody";
      this.lblMessageBody.Size = new System.Drawing.Size(536, 176);
      this.lblMessageBody.TabIndex = 30;
      // 
      // ViewMessage
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(694, 476);
      this.Controls.Add(this.lblMessageBody);
      this.Controls.Add(this.lblAttachments);
      this.Controls.Add(this.pblAttachments);
      this.Controls.Add(this.lblBody);
      this.Controls.Add(this.lblSubject);
      this.Controls.Add(this.lblCopy);
      this.Controls.Add(this.lblFrom);
      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow;
      this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
      this.Name = "ViewMessage";
      this.Text = "Просмотр сообщения";
      this.Load += new System.EventHandler(this.ViewMessage_Load);
      this.ResumeLayout(false);

    }
    #endregion

    private void ViewMessage_Load(object sender, System.EventArgs e)
    {
      lblMessageBody.Text = this.message.Text;
      lblCopy.Text += this.message.CC;
      lblSubject.Text += this.message.Subject;
      lblFrom.Text += this.message.FromEmail;
    }

    private void AddAttachmentsToPanel()
    {
      pblAttachments.Controls.Clear();
      for(int i = message.Attachments.Length -1; i >= 0; i--)
      {
        //MailAttachment attach = (MailAttachment)message.Attachments[i];
        Mail.AttachDescriptor attach = this.message.Attachments[i];
        Label lblNumber = new Label();
        Label lblAttachName = new Label();
        lblNumber.Text = String.Format("#{0}", i + 1);
        lblAttachName.Text = attach.Name;
        lblAttachName.TextAlign = lblNumber.TextAlign = ContentAlignment.MiddleLeft;
        lblAttachName.Anchor = lblNumber.Anchor = AnchorStyles.Top | AnchorStyles.Left;
        lblNumber.Location = new Point(15, i*25);
        lblAttachName.Location = new Point(50, i*25);
        lblNumber.Size = new Size(20, 20);
        lblAttachName.Size = new Size(500, 20);
        //lblNumber.ContextMenu = lblAttachName.ContextMenu = contextMenuDeleteAttach;
        lblNumber.Tag = lblAttachName.Tag = i;
        pblAttachments.Controls.Add(lblNumber);
        pblAttachments.Controls.Add(lblAttachName);
      }
    }
  }
}
Листинг 3.27.
Елена Дьяконова
Елена Дьяконова

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

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

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

Затем:

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

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

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

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