Visual C#通用范例开发金典
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 控件应用

● Windows编程控件

● 数据显示控件

2.1 Windows编程控件

范例2-1 Button控件的使用

实例位置:光盘\ch02\2-1

范例说明

About the Example

过本范例的实现,使读者学会使用Button控件。程序运行效果如图2-1和图2-2所示。

图2-1 程序界面

图2-2 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.把两个Button控件拖放到窗体中并按照下表设置各个控件的属性,界面设计结果如图2-1所示。

3.双击【Hello】按钮,输入代码,实现单击按钮弹出对话框功能。

4.双击【Close】按钮,输入代码,实现关闭应用程序功能。

程序代码

Codes

1.显示Hello对话框

private void btnHello_Click(object sender, EventArgs e)
{
    MessageBox.Show("hello,welcome to c# world!",
    "hello",MessageBoxButtons.OK,MessageBoxIcon.Information);
}

2.【重置】按钮

private void btnClose_Click(object sender, EventArgs e)
{
    Application.Exit();
}

范例2-2 LinkLabel控件的使用

实例位置:光盘\ch02\2-2

范例说明

About the Example

LinkLabel控件是一种为应用程序添加Web样式的链接,它有点类似于HyperLink链接。本例通过使用LinkLabel控件实现两种链接。程序运行效果如图2-3~图2-5所示。

图2-3 程序界面

图2-5 链接到百度网

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.拖放两个LinkLabel链接到窗体界面上,创建图2-3所示的程序界面。设置两个控件的Text属性,分别为“链接到另一个窗体”和“链接到百度网”。

3.双击这两个控件,在LinkClick事件中输入代码,实现链接功能。

程序代码

Codes

1.链接到另一个窗体

private void lnk1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    Form form2 = new Form();
    form2.Show();
    //变色
    this.lnk1.LinkVisited = true;
}

2.链接到一个网站

private void lnk2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    //打开网页
    System.Diagnostics.Process.Start("www.baidu.com");
}

范例2-3 TextBox的使用

实例位置:光盘\ch02\2-3

范例说明

About the Example

TextBox控件是一种为用户提供输入信息的方法。本例通过使用TextBox控件实现用户输入功能。程序运行效果如图2-6和图2-7所示。

图2-6 程序界面

图2-7 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件、TextBox控件和Button控件拖到窗体界面上,创建图2-6所示的程序界面。可以设置TextBox控件的属性,在本例中电话号码一栏的文本框的MaxLength属性设置为8位;显示信息的文本框的Multiline属性设置为“true”。

3.双击Button控件,在Click事件中输入代码,实现提交信息功能。

程序代码

Codes

提交信息

private void btnSubmit_Click(object sender, EventArgs e)
{
    // StringBuilder类包含更多的字符操作
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("姓名:"+this.txtName.Text).AppendLine("电话号码:
    "+this.txtTel.Text);
    this.txtShow.Text = sb.ToString();
}

范例2-4 密码文本框的使用

实例位置:光盘\ch02\2-4

范例说明

About the Example

TextBox控件是一种为用户提供输入信息的方法。本例通过使用TextBox控件的PasswordChar属性实现用户输入不可见的功能。程序运行效果如图2-8和图2-9所示。

图2-8 程序界面

图2-9 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件、TextBox控件和Button控件拖到窗体界面上,创建图2-8所示的程序界面。可以设置TextBox控件的属性,在本例中密码一栏的文本框的PasswordChar属性设置为“字符”。

3.双击Button控件,在Click事件中输入代码,实现提交信息功能。

程序代码

Codes

提交信息

private void btnSubmit_Click(object sender, EventArgs e)
{
    // StringBuilder类包含更多的字符操作
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("用户名:" + this.txtName.Text).AppendLine("密码:" +
    this.txtPwd.Text);
    this.txtShow.Text = sb.ToString();
}

范例2-5 MaskedTextBox的使用

实例位置:光盘\ch02\2-5

范例说明

About the Example

MaskedTextBox控件与TextBox控件类似,但是它限制了输入格式。它的Mask属性有许多格式可以选择。本例通过MaskedTextBox控件的使用实现用户输入的限制。程序运行效果如图2-10和图2-11所示。

图2-10 程序界面

图2-11 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件、TextBox控件、MaskedTextBox控件和Button控件拖到窗体界面上,创建图2-10所示的程序界面。

3.设置邮编的掩码文本框Mask属性为“邮政编码”,设置电话号码的掩码文本框Mask属性为“移动电话号码”。

4.双击Button控件,在Click事件中输入代码,实现显示所输入信息的功能。

程序代码

Codes

提交填写信息

private void btnSubmit_Click(object sender, EventArgs e)
{
    // StringBuilder类包含更多的字符操作
    StringBuilder sb = new StringBuilder();
    sb.AppendLine(this.txtName.Text).AppendLine(this.mskPostCode.Text)
    .AppendLine(this.txtAddress.Text).AppendLine(this.msktxtTel.Text);
    this.txtShow.Text = sb.ToString();
}

范例2-6 RadioButton的使用

实例位置:光盘\ch02\2-6

范例说明

About the Example

范例通过使用RadioButton控件实现单选。程序运行效果如图2-12和图2-13所示。

图2-12 程序界面

图2-13 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将GroupBox控件、RadioButton控件和Label控件拖到窗体界面上,创建图2-11所示的程序界面。

3.在窗体加载事件、两个RadioButton控件的状态改变事件中输入代码,实现显示所选性别的功能。

程序代码

Codes

1.窗体加载时

private void Form1_Load(object sender, EventArgs e)
{
    lblShowText();
}

2.显示当前选择

private void lblShowText()
{
    //Check属性标记是否选中
    if (this.rb1.Checked == true)
    {
          this.lblShow.Text = "当前选择的性别为" + this.rb1.Text;
    }
    else
    {
          this.lblShow.Text = "当前选择的性别为" + this.rb2.Text;
    }
}

3.rb2状态改变时

private void rb2_CheckedChanged(object sender, EventArgs e)
{
    lblShowText();
}

4.rb1状态改变时

private void rb1_CheckedChanged(object sender, EventArgs e)
{
    lblShowText();
}

范例2-7 ComboBox控件的使用

实例位置:光盘\ch02\2-7

范例说明

About the Example

ComboBox控件是一种用于下拉框中显示数据的控件,它是由允许用户输入数据的文本框和用于用户选择项列表的列表框组成。本例通过使用ComboBox控件实现用户选择功能。程序运行效果如图2-14和图2-15所示。

图2-14 程序界面

图2-15 选择一项

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件、ComboBox控件拖放到窗体界面上,创建图2-14所示的程序界面。设置ComboBox控件的Items属性为“大专、大学、研究生、博士生”。

3.双击ComboBox的SelectedIndexChanged事件中输入代码,实现显示用户选择相应项的功能。

程序代码

Codes

选择某项学历

private void combo_SelectedIndexChanged(object sender, EventArgs e)
{
    //获取选择项目的内容
    this.lblShow.Text = "当前选择的学历为:"+this.combo.Items
      [this.combo.SelectedIndex].ToString();
}

范例2-8 CheckBox控件的使用

实例位置:光盘\ch02\2-8

范例说明

About the Example

CheckBox控件是一种可以通过打钩的形式进行用户选择的控件,它有True和False两种值。本例通过使用CheckBox控件实现用户选择功能。程序运行效果如图2-16和图2-17所示。

图2-16 程序界面

图2-17 选择兴趣爱好

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将GroupBox控件、CheckBox控件、Label控件、Button控件和TextBox控件拖放到窗体界面上,创建图2-16所示的程序界面。设置GroupBox控件的Text属性为“兴趣爱好”,设置6个CheckBox控件的Text属性分别为“计算机、体育、购物、艺术、文学、其他”,设置TextBox控件的Multiline属性为“True”。

3.双击Button控件的Click事件,输入代码,实现显示提交用户所选兴趣爱好的功能。

程序代码

Codes

提交选择信息

private void btnSubmit_Click(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    if (this.ck1.Checked)
    {  sb.AppendLine(this.ck1.Text);  }
    if (this.ck2.Checked)
    {  sb.AppendLine(this.ck2.Text);  }
    if (this.ck3.Checked)
    {  sb.AppendLine(this.ck3.Text);  }
    if (this.ck4.Checked)
    {  sb.AppendLine(this.ck4.Text);  }
    if (this.ck5.Checked)
    {  sb.AppendLine(this.ck5.Text);  }
    if (this.ck6.Checked)
    {  sb.AppendLine(this.ck6.Text);  }
    this.txtShow.Text = sb.ToString();
}

范例2-9 多选列表框的使用

实例位置:光盘\ch02\2-9

范例说明

About the Example

范例通过使用CheckedListBox控件实现显示多条数据的功能,并可以通过勾选按钮对多条数据进行操作。程序运行效果如图2-18所示。

图2-18 窗体界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将一个CheckedListBox拖到窗体界面中,设置Name属性为“clbLeft”。在clbLeft列表控件的Items属性中输入1~10十个数字。将ListBox拖到窗体界面中,设置Name属性为“lbRight”。再拖入一个按钮,设置Name的属性为“btnMove”,Text的属性为“移动”。如图2-18所示。

3.双击【移动】按钮,在Click事件中输入代码,实现相应功能。

程序代码

Codes

移动按钮

private void btnMove_Click(object sender, EventArgs e)
{
    if (this.clbLeft.CheckedItems.Count > 0)
    {
          //清空右边所有项
          this.lbRight.Items.Clear();
          for(int i=0;i<this.clbLeft.CheckedItems.Count;i++)
          {
              //Add(Item)添加项目
              this.lbRight.Items.Add(this.clbLeft.CheckedItems[i].ToString());
          }
          for (int j = 0; j < this.clbLeft.Items.Count; j++)
          {
              //设置每一项的选中状态为false
              this.clbLeft.SetItemChecked(j, false);
          }
    }
}

范例2-10 RichTextBox控件的使用

实例位置:光盘\ch02\2-10

范例说明

About the Example

RichTextBox控件是一种用于显示、输入和操作带有格式的文本控件,除了执行TextBox控件的所有功能之外,它还可以显示字体、颜色等功能,有些功能已经在第1章通过例子演示出来了。本例通过使用RichTextBox控件实现链接和字符缩进功能。程序运行效果如图2-19和图2-20所示。

图2-19 程序界面

图2-20 程序运行

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将RichTextBox控件、MenuStrip控件和OpenDialog控件拖放到窗体界面上,创建图2-19所示的程序界面。设置RichTextBox控件的Text属性为“www.baidu.com”。

3.双击RichTextBox控件的LinkClick事件,输入代码,实现链接功能。

4.双击菜单的【Load File】菜单项,输入代码,实现打开文件并设置缩进的功能。

程序代码

Codes

1.单击链接

private void rchShow_LinkClicked(object sender, LinkClickedEventArgs e)
{
    System.Diagnostics.Process.Start(this.rchShow.Text.Trim());
}

2.打开文件并设置缩进

private void miLoadFile_Click(object sender, EventArgs e)
{
    try
    {
          if (this.dlgOpen.ShowDialog() == DialogResult.OK)
          {
              //RichTextBox加载文件
              this.rchShow.LoadFile(this.dlgOpen.FileName,RichTextBoxStreamType.
              PlainText);
          }
          this.rchShow.SelectionIndent = 8;
          this.rchShow.SelectionHangingIndent = 3;
          this.rchShow.SelectionRightIndent = 12;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

范例2-11 错误信息提示控件的使用

实例位置:光盘\ch02\2-11

范例说明

About the Example

范例通过使用ErrorProvider控件实现检验其他控件输入信息正确性的功能。程序运行效果如图2-21所示。

图2-21 窗体界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将按钮、文本框、文本标签和ErrorProvider拖到窗体界面中,如图2-21所示。

3.双击【确定】按钮,在Click事件中输入代码,实现相应功能。

程序代码

Codes

【确定】按钮

private void btnOk_Click(object sender, EventArgs e)
{
    if (this.txtName.Text.Length > 6 && this.txtName.Text.Length < 12 &&
    this.txtTel.Text.Length == 8)
    {
          MessageBox.Show("输入操作正确", "输入提示", MessageBoxButtons.OK,
          MessageBoxIcon.Information);
    }
    else
    {
          if (this.txtName.Text.Length < 6 || this.txtTel.Text.Length > 12)
          {
              this.epShow.SetError(this.txtName, "用户名输入错误");
              DialogResult dlgErrorMes = MessageBox.Show(this, "用户名输入错误,是否
              重新输入?", "信息提示", MessageBoxButtons.OKCancel,
              MessageBoxIcon.Warning);
              switch (dlgErrorMes)
              {
                    case DialogResult.OK:
                    this.txtName.Text = "";
                        break;
                    case DialogResult.Cancel:
                        break;
              }
          }
          if (this.txtTel.Text.Length != 8)
          {
              this.epShow.SetError(this.txtTel, "电话号码位数出错");
              DialogResult dlgErrorMes = MessageBox.Show(this, "电话输入错误,是否重
              新输入?", "信息提示", MessageBoxButtons.OKCancel,
              MessageBoxIcon.Warning);
              switch (dlgErrorMes)
              {
                    case DialogResult.OK:
                    this.txtTel.Text = "";
                    break;
              case DialogResult.Cancel:
                    break;
              }
          }
      }
}

范例2-12 列表控件的使用

实例位置:光盘\ch02\2-12

范例说明

About the Example

范例通过使用ListBox控件实现显示多条数据的功能,并可以对多条数据进行操作。程序运行效果如图2-22所示。

图2-22 窗体界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将两个ListBox拖到窗体界面中,设置Name属性分别为“lbLeft”和“lbRight”。在lbLeft列表控件的Items属性中输入1~10十个数字。再拖入一个按钮,设置Name属性为“btnMove”,Text属性为“移动”,如图2-22所示。

3.双击【移动】按钮,在Click事件中输入代码,实现相应功能。

程序代码

Codes

【移动】按钮

private void btnMove_Click(object sender, EventArgs e)
{
    if (this.lbLeft.SelectedItems.Count > 0)
    {
          lbRight.Items.Clear();
          for (int i = 0; i < lbLeft.SelectedItems.Count; i++)
          {
              lbRight.Items.Add(lbLeft.SelectedItems[i]);
          }
    }
}

范例2-13 列表视图控件的使用

实例位置:光盘\ch02\2-13

范例说明

About the Example

Windows窗体ListView控件显示了带图标项的列表。可使用列表视图创建类似于Windows资源管理器右窗格的用户界面。本范例通过使用ListView控件实现磁盘文件的显示与显示方式的改变。程序运行效果如图2-23所示。

图2-23 运行程序:平铺视图

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.在窗体界面上放入Label控件、GroupBox控件、RadioButton控件、Button控件、两个ImageList控件和ListView控件,创建图2-22所示的程序界面。

3.在两个ImageList控件中分别选择要显示的文件夹和文本的大小图标;选中ListView控件,单击右上角的三角箭头,选择“编辑列”链接,编辑在详细视图中要显示的文件信息列名。

4.在窗体加载事件中输入代码,实现D盘文件的加载和显示。

5.选择每一个RadioButton控件的CheckedChanged事件,输入代码实现视图效果改变。

6.双击【返回】按钮,实现返回上一层文件夹的功能。

程序代码

Codes

1.窗体加载

public Form1()
{
    InitializeComponent();
    folderCol = new System.Collections.Specialized.StringCollection();
    PaintListView(@"D:\");
    folderCol.Add(@"D:\");
}

2.在ListView上产生目录树

private void PaintListView(String root)
{
    try
    {
          ListViewItem lvi;
          ListViewItem.ListViewSubItem lvsi;
          if (root == "")
    {
          return;
    }
    //公开创建目录树
    DirectoryInfo dir = new DirectoryInfo(root);
    //获取目录树的所有目录
    DirectoryInfo[] dirs = dir.GetDirectories();
    //获取目录树的所有文件
    FileInfo[] fis = dir.GetFiles();
    //清空ListView中的目录树
    this.lstViewFileAndFloders.Items.Clear();
    //设置当前路径
    this.lblCurrentPath.Text = root;
    //开始操作ListView
    this.lstViewFileAndFloders.BeginUpdate();
    //添加目录
    foreach (DirectoryInfo di in dirs)
    {
          //在ListView上产生一个目录的第1列(名称)
          lvi = new ListViewItem();
          lvi.Text = di.Name;
          lvi.Tag = di.FullName;
          lvi.ImageIndex = 0;
          lvi.Tag = di.FullName;
          //在ListView上产生一个目录的第2列(大小)
          lvsi = new ListViewItem.ListViewSubItem();
          lvsi.Text = "";
          lvi.SubItems.Add(lvsi);
          //在ListView上产生一个目录的第3列(最后访问时间)
          lvsi = new ListViewItem.ListViewSubItem();
          lvsi.Text = di.LastAccessTime.ToShortDateString();
          lvi.SubItems.Add(lvsi);
          //将整个Item添加到ListView上
          this.lstViewFileAndFloders.Items.Add(lvi);
    }
    foreach (FileInfo fi in fis)
    {
          //在ListView上产生一个文件的第1列(名称)
          lvi = new ListViewItem();
          lvi.Text = fi.Name;
          lvi.ImageIndex = 1;
          lvi.Tag = fi.FullName;
          //在ListView上产生一个文件的第2列(大小)
          lvsi = new ListViewItem.ListViewSubItem();
          lvsi.Text = fi.Length.ToString();
          lvi.SubItems.Add(lvsi);
          //在ListView上产生一个文件的第3列(最后访问时间)
          lvsi = new ListViewItem.ListViewSubItem();
          lvsi.Text = fi.LastAccessTime.ToShortDateString();
          lvi.SubItems.Add(lvsi);
          //将整个Item添加到ListView上
          this.lstViewFileAndFloders.Items.Add(lvi);
    }
    //结束操作ListView
          this.lstViewFileAndFloders.EndUpdate();
      }
      catch (Exception ex)
      {
          MessageBox.Show(ex.Message);
      }
}

3.激活ListView上一项时发生

private void lstViewFileAndFloders_ItemActivate(object sender, EventArgs e)
{
    ListView lvi = (ListView)sender;
    string filename = lvi.SelectedItems[0].Tag.ToString();
    if (lvi.SelectedItems[0].ImageIndex != 0)
    {
          try
          {
              if (lvi.SelectedItems[0].ImageIndex == 0)
              {
                  PaintListView(filename);
                  folderCol.Add(filename);
              }
              else
              {
                  System.Diagnostics.Process.Start(filename);
              }
          }
          catch
          {
              return;
          }
    }
    else
    {
        PaintListView(filename);
        folderCol.Add(filename);
    }
}

4.视图为列表

private void rdoList_CheckedChanged(object sender, EventArgs e)
{
    //改变显示方式
    this.lstViewFileAndFloders.View = View.List;
}

5.视图为详细

private void rdoDetails_CheckedChanged(object sender, EventArgs e)
{
    this.lstViewFileAndFloders.View = View.Details;
}

6.返回某层目录

private void btnBack_Click(object sender, EventArgs e)
{
    if (folderCol.Count > 1)
    {
          PaintListView(folderCol[folderCol.Count -2].ToString());
          folderCol.RemoveAt(folderCol.Count -1);
    }
    else
    {
          PaintListView(folderCol[0].ToString());
    }
}

7.视图为小图标时

private void rdoSmallIcon_CheckedChanged(object sender, EventArgs e)
{
    this.lstViewFileAndFloders.View = View.SmallIcon;
}

8.视图为大图标

private void rdoLargeIcon_CheckedChanged(object sender, EventArgs e)
{
    this.lstViewFileAndFloders.View = View.LargeIcon;
}

范例2-14 帮助控件的使用

实例位置:光盘\ch02\2-14

范例说明

About the Example

范例通过使用HelpProvider控件实现帮助文件与应用程序的关联。帮助文件可以是.html文件,也可以是.chm文件。程序运行效果如图2-24和图2-25所示。

图2-24 程序界面

图2-25 帮助文件

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.在窗体界面上放入Label控件和HelpProvidder控件,创建图2-24所示的程序界面。

3.创建一个.html页面作为帮助页面,输入帮助信息,如图2-25所示。

4.设置相应的属性,实现应用程序与帮助文件的关联:设置helpProvider控件的HelpNamespace属性为“D:\document\新建文件夹\源代码\CH02\EX014\CODE\HelpProvider EX\help.html”,设置窗体ShowHelponhelpPro属性为“True”,HelpKeywordonhelppro属性为“F1”。

范例2-15 进度条控件的使用

实例位置:光盘\ch02\2-15

范例说明

About the Example

Windows窗体ProgressBar控件通过在水平条中显示适当数目的矩形来指示进程的进度。进程完成时,进度栏被填满。本范例通过使用ProgressBar控件实现自定义的进度显示功能。程序运行效果如图2-26和图2-27所示。

图2-26 菜单界面

图2-27 程序运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件、TextBox控件、Button控件和ProgressBar控件拖到窗体界面中,如图2-26所示。

3.双击Button控件,输入代码实现自定义的进度显示功能,如图2-27所示。

程序代码

Codes

计算进度

private void btnClick_Click(object sender, EventArgs e)
{
    int intOuter = Convert.ToInt32(this.txtOuter.Text);
    int intInner = Convert.ToInt32(this.txtInner.Text);
    //  设置进度条最大值属性
    this.pBar1.Maximum = intOuter;
    this.pBar2.Maximum = intInner;
    //开始计算过程
    for (int i = 1; i <= intOuter; i++)
    {
          for (int j = 1; j <= intInner; j++)
          {
              double d = i + j;
              // 设置内循环进度条当前值
              if ((i * 1000) % intOuter == 0)
              {
                  this.pBar2.Value = j;
              }
          }
          // 设置外循环进度条当前值
          if ((i * 100) % intOuter == 0)
          {
              this.pBar1.Value = i;
              double progress = (double)(i) / intOuter * 100;
              this.lblShow.Text = "当前进度:"+progress.ToString() + "%";
          }
    }
}

范例2-16 NumericUpDown的使用

实例位置:光盘\ch02\2-16

范例说明

About the Example

NumericUpDown控件由一个文本框和一对用户可单击的箭头组成,可以显示和设置固定的数值。本例通过NumericUpDown控件的使用,实现用户选择值的功能。程序运行效果如图2-28和图2-29所示。

图2-28 程序界面

图2-29 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件、NumericUpDown控件和Button控件拖到窗体界面上,创建图2-28所示的程序界面。

3.双击Button控件,在Click事件中输入代码,实现显示所选年龄的功能,如图2-29所示。

程序代码

Codes

提交年龄信息

private void btnSubmit_Click(object sender, EventArgs e)
{
    this.lblShow.Text = "当前选择年龄:" + this.nud.Value.ToString();
}

范例2-17 DomainUpDown的使用

实例位置:光盘\ch02\2-17

范例说明

About the Example

DomainUpDown控件由一个文本框和一对用于在列表中上下移动的按钮组成,可以显示和设置文本字符串。本例通过DomainUpDown控件的使用实现用户选择文本字符串的功能。程序运行效果如图2-30和图2-31所示。

图2-30 程序界面

图2-31 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件、DomainUpDown控件、NumericUpDown控件、Button控件和TextBox控件拖到窗体界面上,创建图2-30所示的程序界面。

3.将NumericUpDown控件中的Maximun属性设置为“120”;将DomainUpDown控件中的Item属性设置为“博士、硕士、大学、高中、初中、小学”。如图2-31所示。

4.双击Button控件,在Click事件中输入代码,实现显示所选信息的功能。

程序代码

Codes

提交信息

private void btnSubmit_Click(object sender, EventArgs e)
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("姓名:" + this.txtName.Text)
    .AppendLine("年龄:" + this.nUD.Value)
    .AppendLine("学历:" + this.dUD.SelectedItem);
    this.txtShow.Text = sb.ToString();
}

范例2-18 TrackBar的使用

实例位置:光盘\ch02\2-18

范例说明

About the Example

TrackBar控件用于在大量信息中进行浏览或用于以可视的形式调整数字设置。它由两部分组成:滑动块和刻度线。本例通过TrackBar控件与ProgressBar控件的结合使用,实现用户自定义的进度设置的功能。程序运行效果如图2-32和图2-33所示。

图2-32 程序界面

图2-33 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将ProgressBar控件、TrackBar控件、Button控件和Timer控件拖到窗体界面上,创建图2-32所示的程序界面。

3.在Timer控件的Tick事件中添加代码设置进度条的进度,在TrackBar的Scroll事件中添加代码设置计数器间歇时间。

4.双击Button控件,在Click事件中输入代码,实现开始和停止进度条工作的功能,如图2-33所示。

程序代码

Codes

1.计数器设置

private void timer1_Tick(object sender, EventArgs e)
{
    if (this.pBar.Value == this.pBar.Maximum)
    {
          this.pBar.Value = this.pBar.Minimum;
    }
    else
    {
          this.pBar.PerformStep();
    }
    int FinishedPercent;
    FinishedPercent = 100 * (this.pBar.Value - this.pBar.Minimum)
    / (this.pBar.Maximum - this.pBar.Minimum);
    this.lblProgress.Text = Convert.ToInt16(FinishedPercent).ToString() + "%";
}

2.trackBar设置

private void tBar_Scroll(object sender, EventArgs e)
{
timer1.Interval = Convert.ToInt16(1000 / this.tBar.Value);
}

3.【开始】按钮

private void btnBegin_Click(object sender, EventArgs e)
{
    if (timer1.Enabled == true)
    {
          timer1.Enabled = false;
          this.btnBegin.Text = "开始";
    }
    else
    {
          timer1.Enabled = true;
          this.btnBegin.Text = "停止";
    }
}

范例2-19 Eventlog控件的使用

实例位置:光盘\ch02\2-19

范例说明

About the Example

件日志记录了重要的软件或硬件的事件信息,而Eventlog控件可以访问或自定义Windows事件日志。通过Eventlog可以读取现有的日志或向日志中写入项,创建或删除事件源,删除日志等。本例通过使用Eventlog控件创建用户自定义事件源。程序运行效果如图2-34和图2-35所示。

图2-34 程序界面

图2-35 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件、TextBox控件和Button控件拖到窗体界面上,创建图2-34所示的程序界面,实现简单的除法计算器。

3.双击Button控件,在Click事件中输入代码,实现除法计算的功能。如图2-35所示。若发生异常,则将异常写入日志中。

程序代码

Codes

除法计算

private void btnClick_Click(object sender, EventArgs e)
{
    try
    {
          int intNum1 = Convert.ToInt32(this.txtDivided1.Text);
          int intNum2 = Convert.ToInt32(this.txtDivided2.Text);
          this.lblR.Text = Convert.ToString(intNum1 / intNum2);
    }
    catch (Exception ex)
    {
          if (!System.Diagnostics.EventLog.SourceExists("WriteToLog"))
          {
              System.Diagnostics.EventLog.CreateEventSource("WriteToLog",
              "WriteToLog");
          }
          System.Diagnostics.EventLog eventlog = new
          System.Diagnostics.EventLog();
          eventLog.Source = "WriteToLog";
          eventLog.WriteEntry("An error occurs.");
    }
}

范例2-20 HScrollBar控件的使用

实例位置:光盘\ch02\2-20

范例说明

About the Example

Windows窗体的ScrollBar控件用于在应用程序里或控件中的水平或垂直滚动,以便在较长的项列表或大量信息中转移。有两种滚动条:HScrollBar和VScrollBar。本例通过使用HScrollBar控件创建颜色滚动条实现背景色的变化。程序运行效果如图2-36和图2-37所示。

图2-36 程序界面

图2-37 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件和HScrollBar控件拖到窗体界面上,创建图2-36所示的程序界面。

3.双击每个HScrollBar控件的Scroll事件,输入代码实现滚动条变换背景色的功能,如图2-37所示。

程序代码

Codes

1.窗体加载

private void Form1_Load(object sender, EventArgs e)
{
    hSBarRed.Value = 0;
    hSBarGreen.Value = 0;
    hSBarBlue.Value = 0;
    this.lblColor.BackColor = Color.FromArgb(0, 0, 0);
}

2.红色滑条滚动时

private void hSBarRed_Scroll(object sender, ScrollEventArgs e)
{
    int intRed=Convert.ToInt32(hSBarRed.Value);
    int intGreen = Convert.ToInt32(hSBarGreen.Value);
    int intBlue = Convert.ToInt32(hSBarBlue.Value);
    this.lblColor.BackColor = Color.FromArgb(intRed, intGreen, intBlue);
    this.lblRValue.Text = intRed.ToString();
}

3.绿色滑条滚动时

private void hSBarGreen_Scroll(object sender, ScrollEventArgs e)
{
    int intRed = Convert.ToInt32(hSBarRed.Value);
    int intGreen = Convert.ToInt32(hSBarGreen.Value);
    int intBlue = Convert.ToInt32(hSBarBlue.Value);
    this.lblColor.BackColor = Color.FromArgb(intRed, intGreen, intBlue);
    this.lblGValue.Text = intGreen.ToString();
}

4.蓝色滑条滚动时

private void hSBarBlue_Scroll(object sender, ScrollEventArgs e)
{
    int intRed = Convert.ToInt32(hSBarRed.Value);
    int intGreen = Convert.ToInt32(hSBarGreen.Value);
    int intBlue = Convert.ToInt32(hSBarBlue.Value);
    this.lblColor.BackColor = Color.FromArgb(intRed, intGreen, intBlue);
    this.lblBValue.Text = intBlue.ToString();
}

范例2-21 树视图控件的使用

实例位置:光盘\ch02\2-21

范例说明

About the Example

范例通过使用Treeview控件实现托盘功能。程序运行效果如图2-38和图2-39所示。

图2-38 程序界面

图2-39 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将TreeView控件和Label控件拖到窗体界面中,如图2-38所示。

3.在窗体加载事件中输入代码,实现动态添加树节点的功能;双击树视图的AfterSelect事件,输入代码,实现单击相应节点后在Label控件中显示被选中的树节点,如图2-39所示。

程序代码

Codes

1.窗体加载时

private void Form1_Load(object sender, EventArgs e)
{
    this.tV.Nodes.Add("根节点");
    this.tV.Nodes[0].Text = "根节点";
    this.tV.Nodes[0].Nodes.Add("一级子节点1");
    this.tV.Nodes[0].Nodes[0].Text = "一级子节点1";
    this.tV.Nodes[0].Nodes.Add("一级子节点2");
    this.tV.Nodes[0].Nodes[1].Text = "二级子节点2";
    this.tV.Nodes[0].Nodes[0].Nodes.Add("二级子节点1");
    this.tV.Nodes[0].Nodes[0].Nodes[0].Text = "二级子节点";
    /所有节点展开
    this.tV.ExpandAll();
}

2.选择了节点后

private void tV_AfterSelect(object sender, TreeViewEventArgs e)
{
    this.label1.Text = "当前选定节点:" + this.tV.SelectedNode.Text;
}

范例2-22 窗体分割控件的使用

实例位置:光盘\ch02\2-22

范例说明

About the Example

以将Windows窗体SplitContainer控件看做是一个复合体,它是由一个可移动的拆分条分隔的两个面板。当鼠标指针悬停在该拆分条上时,指针相应地改为灰度校正状,以显示该拆分条是可移动的。本范例通过使用SplitContainer控件实现拆分功能。程序运行效果如图2-40和图2-41所示。

图2-4 链接到另一个窗体

图2-40 程序界面

图2-41 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将两个SplitContainer控件、TreeView控件、ListView控件和RichTextBox拖到窗体界面中,如图2-40所示。一个SplitContainer控件的方向是左右结构,另一个是上下结构。

3.在窗体加载事件中输入代码,实现动态在树视图中添加磁盘信息的功能;动态在列表视图中添加txt文件的功能;动态在RichTextBox的显示txt文本的功能,如图2-41所示。

程序代码

Codes

1.窗体加载时

private void Form1_Load(object sender, EventArgs e)
{
    //加载所有磁盘到树上
    this.LoadAllDevicesToTreeView();
}

2.加载所有驱动盘

public void LoadAllDevicesToTreeView()
{
    DriveInfo[] driver = DriveInfo.GetDrives();
    foreach (DriveInfo drv in driver)
    {
        TreeNode tnode = new TreeNode(drv.Name, 0, 0);
        tnode.Name = drv.Name;
        if (drv.IsReady)
        {
              tnode.ToolTipText = drv.Name + "磁盘大小:" + drv.TotalSize;
              //加载此磁盘下所有文件
              LoadFolderInFoldersToTV(drv.Name, tnode);
              this.treeViewShow.Nodes.Add(tnode);
        }
    }
}

3.显示目录树

public void LoadFolderInFoldersToTV(string folder, TreeNode node)
{
    string[] folders = Directory.GetDirectories(folder);
    foreach (string fod in folders)
    {
          if ((File.GetAttributes(fod) & FileAttributes.Hidden) ==
          FileAttributes.Hidden)
          {
              continue;
          }
          //新建节点
          TreeNode tnode = new TreeNode(Path.GetFileName(fod), 1, 2);
          tnode.Name = fod;
          tnode.ToolTipText = "文件夹" + fod;
          //添加节点
          node.Nodes.Add(tnode);
    }
}

4.加号展开后的显示

public void LoadNextFolderInFoldersToTV(string folder, TreeNode node)
{
    string[] folders = Directory.GetDirectories(folder);
    foreach (string fod in folders)
    {
          if ((File.GetAttributes(fod) & FileAttributes.Hidden) ==
          FileAttributes.Hidden)
          {
              continue;
          }
          TreeNode tnode = new TreeNode(Path.GetFileName(fod), 1, 2);
          tnode.Name = fod;
          tnode.ToolTipText = "文件夹" + fod;
          node.Nodes.Add(tnode);
    }
}

5.展开加号

private void treeViewShow_AfterExpand(object sender, TreeViewEventArgs e)
{
    foreach (TreeNode tnode in e.Node.Nodes)
    {
          tnode.Nodes.Clear();
          this.LoadNextFolderInFoldersToTV(tnode.Name, tnode);
    }
}

6.选中树上的节点

private void treeViewShow_AfterSelect(object sender, TreeViewEventArgs e)
{
    //取得该节点下的文本文件
    LoadAllFileInFolder(e.Node.FullPath);
}

7.取得文件夹中的文件,加到lstviewDetail中

private void LoadAllFileInFolder(string folder)
{
    if (folder.Contains("System Volume Information"))
    {
          return;
    }
    this.lstviewDetail.Items.Clear();
    string[] fodtxt = Directory.GetFiles(folder, "*.txt");
    ListViewItem[] lvl = new ListViewItem[fodtxt.Length];
    for (int i = 0; i < fodtxt.Length; i++)
    {
          lvl[i] = new ListViewItem(fodtxt[i]);
          this.lstviewDetail.Items.Add(lvl[i]);
          this.lstviewDetail.View = View.List;
    }
}

8.在richtxtBoxDetail中显示文本信息

private void lstviewDetail_ItemActivate(object sender, EventArgs e)
{
    try
    {
          string fileExtension =
          Path.GetExtension(this.lstviewDetail.SelectedItems[0].Text);
          if (fileExtension == ".txt")
          {
              this.richtxtBoxDetail.LoadFile(this.lstviewDetail.
              SelectedItems[0].Text, RichTextBoxStreamType.PlainText);
          }
          this.Text = Path.GetFileName(this.lstviewDetail.SelectedItems[0].Text);
    }
    catch
    {
          MessageBox.Show(this, "该文件正由另一进程访问", "加载文件失败",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

范例2-23 DateTimePicker的使用

实例位置:光盘\ch02\2-23

范例说明

About the Example

范例通过使用DateTimePicker控件实现日期的选择。程序运行效果如图2-42和图2-43所示。

图2-42 程序界面

图2-43 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将Label控件、DateTimePicker控件和Button控件拖到窗体界面上,创建图2-42所示的程序界面。

3.双击【提交】按钮,在Click事件中输入代码,实现显示所选日期功能。

程序代码

Codes

1.窗体加载时

private void Form1_Load(object sender, EventArgs e)
{
    this.dateTimePic.CustomFormat = "'今天是:'dddd MMMM dd, yyyy";
}

2.提交信息

private void btnSubmit_Click(object sender, EventArgs e)
{
    this.lblSel.Text = "当前选择的日期是:" + this.dateTimePic.Value.
    ToShortDateString();
}

范例2-24 MonthCalendar控件的使用

实例位置:光盘\ch02\2-24

范例说明

About the Example

MonthCalendar控件是一种方便用户查看和设置日期信息的图形界面控件,它显示一个网格,网格中包含月份和编号日期。本例通过使用MonthCalendar控件实现用户选择日期和设置重要日期的功能。程序运行效果如图2-44和图2-45所示。

图2-44 程序界面

图2-45 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将MonthCalendar控件拖放到窗体界面上,创建图2-44所示的程序界面。

3.在窗体的构造函数中输入代码,实现窗体上一行显示两列日历和设置特殊日期的功能。

程序代码

Codes

显示日历信息和特殊日期

public Form1()
{
    InitializeComponent();
    //窗体上显示两列一行月历
    this.calendar.CalendarDimensions = new System.Drawing.Size(2, 1);
    //设置特殊日期
    DateTime dtSpecialTime = new DateTime(2007, 11, 2);
    this.calendar.AddBoldedDate(dtSpecialTime);
}

范例2-25 图像控件的使用

实例位置:光盘\ch02\2-25

范例说明

About the Example

范例通过使用ImageList控件实现存储图片列表功能。程序运行效果如图2-46所示。

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.将图像控件、ImageList控件和按钮拖到窗体界面中,如图2-46所示。

图2-46 窗体界面

3.单击每个按钮,添加代码,实现相应功能。

程序代码

Codes

static int intNum = 0;

1.窗体加载时

private void Form1_Load(object sender, EventArgs e)
{
    //获取List中的图像
    this.pb.Image = this.imageList1.Images[0];
    intNum = 0;
    stateChanged(false, true, false, true);
}

2.图像列表中的第一个

private void btnFirst_Click(object sender, EventArgs e)
{
    this.pb.Image = this.imageList1.Images[0];
    intNum = 0;
    stateChanged(false, true, false, true);
}

3.获得下一个图像

private void btnNext_Click(object sender, EventArgs e)
{
    this.pb.Image = this.imageList1.Images[intNum + 1];
    intNum++;
    if (intNum == this.imageList1.Images.Count -1)
    {
          stateChanged(true, false, true, false);
    }
    else
    {
          stateChanged(true, true, true, true);
    }
}

4.获得上一个图像

private void btnPre_Click(object sender, EventArgs e)
{
    this.pb.Image = this.imageList1.Images[intNum -1];
    intNum--;
    if (intNum == 0)
    {
          stateChanged(false, true, false, true);
    }
    else
    {
          stateChanged(true, true, true, true);
    }
}

5.最后一个图像

private void btnLast_Click(object sender, EventArgs e)
{
    this.pb.Image = this.imageList1.Images[this.imageList1.Images.Count -1];
    intNum = this.imageList1.Images.Count -1;
    stateChanged(true, false, true, false);
}

6.设置4个按钮的状态

private void stateChanged(bool first,bool next,bool pre,bool last)
{
    this.btnFirst.Enabled = first;
    this.btnLast.Enabled = last;
    this.btnNext.Enabled = next;
    this.btnPre.Enabled = pre;
}

范例2-26 图片按钮实例

实例位置:光盘\ch02\2-26

范例说明

About the Example

范例讲解如何使用PictrueBox控件,重点请注意该控件Click事件的使用。程序运行效果如图2-47~图2-49所示。

图2-47 程序界面

图2-49 运行程序

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.分别为MainForm、Pic1Form、Pic2Form三个窗体。

3.选择窗体MainForm,设置主窗体的几个属性如下:Caption为“图片按钮实例”,Picture属性为“随书光盘图片资源见image目录”,其他属性默认。

4.在主窗体上添加两个PictrueBox控件,Image属性分别为“图1”和“图2”。

5.在Pic1Form和Pic2Form中分别添加Lable控件,设置其Text属性为“图1被选中”和“图2被选中”。

6.单击主窗体中的图1和图2(如图2-47所示),分别弹出图2-48和图2-49。

图2-48 运行程序

程序代码

Codes

1.单击图片1

private void picEX1_Click(object sender, EventArgs e)
{
    Pic1Form pic1 = new Pic1Form();
    pic1.MdiParent = this.MdiParent;
    pic1.Show();
}

2.单击图片2

private void picEX1_Click(object sender, EventArgs e)
{
    Pic1Form pic1 = new Pic1Form();
    pic1.MdiParent = this.MdiParent;
    pic1.Show();
}

抛砖引玉

About the Guidance

可以通过设置Pictrue控件的其他属性和事件,进行该控件的其他功能。

注意:

本例的Click事件是该控件的常用功能。

范例2-27 Timer控件实例

实例位置:光盘\ch02\2-27

范例说明

About the Example

范例讲解如何使用Timer控件,重点请注意该控件Tick事件的使用。程序运行效果如图2-50所示。

图2-50 运行程序

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体MainForm,设置主窗体的几个属性如下:Caption为“Timer实例”,其他属性默认。

3.在窗体上添加两个Lable控件,它们的Text属性均为“none”。

4.在窗体上添加Timer控件,其Interval为1000。

5.运行程序,出现图2-50所示的结果。

程序代码

Codes

1.窗体加载

private void MainForm_Load(object sender, EventArgs e)
{
    DateTime time = DateTime.Now;
    int hour = time.Hour;
    int minute = time.Minute;
    int second = time.Second;
    timer = new TimerClass(hour, minute, second);
    this.lblTimeNow.Text = "窗体加载时刻:"+hour+":"+minute+":"+second;
    this.timer1.Start();
}

2.时间跳动

private void timer1_Tick(object sender, EventArgs e)
{
    this.timer++;
    this.lblTimeRun.Text = "时钟每秒跳动:"+timer.Hours+":"+timer.Minutes+":"
        +timer.Seconds;
}

抛砖引玉

About the Guidance

Timer控件主要的使用属性在Interval(毫秒级),即Tick事件触发的频率,本例中的1000即为1秒钟。

注意:

Timer控件只有Tick一个可以触发的事件,读者掌握这个事件即可。

范例2-28 ToolTip控件实例

实例位置:光盘\ch02\2-28

范例说明

About the Example

范例讲解如何使用ToolTip控件,请注意该控件SetToolTip方法的使用。程序运行效果如图2-51和图2-52所示。

图2-51 运行结果1

图2-52 运行结果2

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体MainForm,属性默认。

3.在窗体上添加两个Button控件,它们的Text属性分别为“确定”和“取消”。

4.在窗体上添加Lable控件,其Text属性为“none”,另外添加一个文本框控件。

5.运行程序,出现图2-51和图2-52所示的结果。

程序代码

Codes

1.窗体加载

private void MainForm_Load(object sender, EventArgs e)
{
    this.toolTip1.SetToolTip(this.btnOK, "单击按钮,显示输入的内容");
    this.toolTip1.SetToolTip(this.btnCancel, "单击按钮,取消输入的内容");
    this.toolTip1.SetToolTip(this.txtInput, "输入文本");
    this.toolTip1.SetToolTip(this.lblInput, "显示输入的文本");
}

2.【确定】按钮

private void btnOK_Click(object sender, EventArgs e)
{
    if (this.txtInput.Text != "")
    {
          this.lblInput.Text ="输入内容是:"+ this.txtInput.Text.Trim();
    }
}

3.【取消】按钮

private void btnCancel_Click(object sender, EventArgs e)
{
    this.txtInput.Text = "";
    this.lblInput.Text = "none";
}

抛砖引玉

About the Guidance

ToolTip控件主要的使用在于它的SetToolTip方法,用于设置窗体上控件的显示文本。

注意:

ToolTip控件的使用效果,是将鼠标放在控件上停留片刻产生的提示效果,主要用于显示控件可以实现的相关功能。

范例2-29 NotifyIcon控件实例

实例位置:光盘\ch02\2-29

范例说明

About the Example

范例讲解如何使用NotifyIcon控件,重点请注意该控件SetToolTip方法的使用。程序运行效果如图2-53所示。

图2-53 运行结果

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体MainForm,属性默认。

3.在窗体上添加NotifyIcon控件,设置它的Icon属性为“test.ico”。

4.在窗体上添加两个ContextMenuStrip控件,它的3个ToolStripMenuItem.的Text属性分别为“显示窗口”、“隐藏窗口”和“退出程序”。

5.运行程序,出现图2-53所示的结果。在状态栏上的图标上单击鼠标右键,出现【显示窗口】、【隐藏窗口】和【退出程序】3个菜单项,单击即可观察到效果。

程序代码

Codes

1.显示窗口

private void tsmiShowForm_Click(object sender, EventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    if (!this.Visible)
    {
      this.Show();
    }
}

2.隐藏窗口

private void tsmiHideForm_Click(object sender, EventArgs e)
{
    if (this.Visible)
    {
      this.Hide();
    }
}

3.退出程序

private void tsmiExit_Click(object sender, EventArgs e)
{
    this.Close();
    Application.Exit();
}

抛砖引玉

About the Guidance

NotifyIcon控件使用时,可以设置窗体的TopMost,观察显示效果。

技巧:

NotifyIcon控件使用时,注意设置窗体的ShowInTaskbar属性为“False”时,显示托盘时,在状态栏不显示最小化窗口;为“True”时,则状态栏显示最小化窗口。

范例2-30 GroupBox控件实例

实例位置:光盘\ch02\2-30

范例说明

About the Example

范例讲解如何使用GroupBox控件,程序运行效果如图2-54和图2-55所示。

图2-54 运行界面1

图2-55 运行界面2

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建两个窗体MainForm和ShowMessageForm,属性默认。

3.在MainForm窗体上添加GroupBox,Text属性为“信息输入”,在它的内部添加姓名、性别的Label、TextBox和Radiobutton,如图2-54所示。在窗体上添加两个Button控件,Text属性分别为“保存”和“关闭”。另外添加“保存”和“不保存”的RadioButton。

4.在ShowMessageForm窗体上,添加【ListView】和【关闭】按钮,列表添加两列“姓名”和“性别”。

5.运行程序,如图2-54所示,输入信息后,在默认条件下,可以直接保存信息,当单击【不保存】按钮时,【保存】按钮不可用。保存后,弹出图2-55所示的窗体,显示输入的信息。

程序代码

Codes

Hashtable message = new Hashtable();
ShowMessageForm messageform = new ShowMessageForm();

1.保存

private void btnSave_Click(object sender, EventArgs e)
{
    if (this.txtName.Text.Trim() == "")
    {
      MessageBox.Show("请输入姓名!");
    }
    else if (!this.rbMale.Checked && !this.rbFemale.Checked)
    {
      MessageBox.Show("请选择性别!");
    }
    else
    {
      if (this.rbMale.Checked)
      {
        this.message.Add(this.txtName.Text.Trim(), this.rbMale.Text);
    }
    else
    {
        this.message.Add(this.txtName.Text.Trim(), this.rbFemale.Text);
    }
    this.messageform.InputMessage = message;
    if (this.messageform.ShowDialog() == DialogResult.OK)
    {
    }
  }
}

2.单选按钮事件

private void rbSave_CheckedChanged(object sender, EventArgs e)
{
    this.btnSave.Enabled = true;
}
private void rbNoSave_CheckedChanged(object sender, EventArgs e)
{
    this.btnSave.Enabled = false;
}
关闭
this.Close();

抛砖引玉

About the Guidance

对于集合类HashTable的使用,需要引用System.Collections。

注意:

使用GroupBox可发现,放在其内部的两个单选框与外部的两个单选框已经分开。

范例2-31 TabControl控件实例

实例位置:光盘\ch02\2-31

范例说明

About the Example

范例讲解如何使用TabControl控件,程序运行效果如图2-56和图2-57所示。

图2-56 选择列表视图

图2-57 选择树视图

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建一个窗体,属性默认。

3.在窗体上添加TabControl,TabPage的Text属性分别为“列表视图”和“树视图”。

4.在列表视图中,添加Listview,View属性为“List”,Dock属性为“Fill”。在树视图中添加TreeView,Dock属性为“Fill”。

5.运行程序,列表视图显示如图2-56所示,切换到树视图显示,如图2-57所示。

程序代码

Codes

1.主窗体加载

private void Form1_Load(object sender, EventArgs e)
{
    InitTreeView();
    InitDriverRoot();
}
根据磁盘名称取得该磁盘下的所有文件夹及文本文件
private void LoadAllFolderInDriver(string driverName)
{
    //系统文件夹"System Volume Information"不允许直接访问
    if (driverName.Contains("System Volume Information"))
    {
      return;
    }
    this.lvwFolders.Items.Clear();
    try
    {
      string[] strFolders = Directory.GetDirectories(driverName);
      ListViewItem[] ltvItems = new ListViewItem[strFolders.Length];
      for (int i = 0; i < ltvItems.Length; i++)
      {
          ltvItems[i] = new ListViewItem(strFolders[i]);
          ltvItems[i].ImageIndex = 0;
      }
      this.lvwFolders.Items.AddRange(ltvItems);
    }
    catch
    {
          MessageBox.Show(this, "设备未就绪", "设备错误", MessageBoxButtons.OK,
          MessageBoxIcon.Error);
          return;
    }
}

2.初始化树视图控件

private void InitTreeView()
{
    DriveInfo[] driInfo = DriveInfo.GetDrives();
    TreeNode[] nodes = new TreeNode[driInfo.Length];
    for (int i = 0; i < driInfo.Length; i++)
    {
      nodes[i] = new TreeNode(driInfo[i].Name, 2, 2);
      //判断磁盘是否就绪
      if (driInfo[i].IsReady)
      {
          ConstructTreeNode(nodes[i]);
      }
  }
  this.tvwFolders.Nodes.AddRange(nodes);
}

3.构造树视图控件的节点

private void ConstructTreeNode(TreeNode parentNode)
{
    if (parentNode.Text.Contains("System Volume Information"))
    {
      return;
    }
    string[] strFolders = Directory.GetDirectories(parentNode.Text);
    TreeNode[] nodes = new TreeNode[strFolders.Length];
    for (int i = 0; i < strFolders.Length; i++)
    {
      nodes[i] = new TreeNode(strFolders[i], 0, 1);
      if (nodes[i].Text.Contains("System Volume Information"))
      {
          continue;
      }
    }
    parentNode.Nodes.AddRange(nodes);
}

4.初始化磁盘的下拉框

private void InitDriverRoot()
{
    string[] strDrivers = Directory.GetLogicalDrives();
    if (strDrivers.Length > 0)
    {
      comBoxRoot.Items.AddRange(strDrivers);
      comBoxRoot.SelectedIndex = 0;
    }
}

5.逻辑磁盘下拉框选择事件

private void comBoxRoot_SelectedIndexChanged(object sender, EventArgs e)
{
    LoadAllFolderInDriver(this.comBoxRoot.Text);
}

抛砖引玉

About the Guidance

对于文件的操作,需要引用System.IO。

注意:

此本范例只能访问到逻辑磁盘下的第一级目录。

范例2-32 ToolStrip控件——Button

实例位置:光盘\ch02\2-32

范例说明

About the Example

范例讲解如何使用ToolStripButton控件,程序运行效果如图2-58所示。

图2-58 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加RichTextBox,属性默认。

4.在窗体上添加ToolStrip,添加3个ToolStripButton,Text与ToolTipText属性相同,分别为“打开”、“保存”和“退出”。“打开”和“保存”项的Image属性对应Windows的“打开”和“保存”图标;“退出”的DisplayStyle属性为“Text”,其他属性默认。

5.运行程序,弹出图2-58所示的窗体,在工具栏上单击“打开”按钮,显示打开文件对话框,选中.txt文件,文件内容显示在RichTextBox中;单击“保存”按钮,显示保存文件对话框,保存RichTextBox中的内容;单击【退出】按钮,关闭窗口。

抛砖引玉

About the Guidance

本范例在打开和保存时,使用到系统的打开和保存文件对话框。

注意:

ToolStripButton的DisplayStyle属性需要读者按照所求进行修改,可以显示文本和图片。

技巧:

选择和保存文件时,需要注意对话框的Filter属性,如本例代码中的“文本文件(*.txt)|*.txt|所有文件(*.*)|*.*”;筛选的内容通过“|”分隔。

范例2-33 ToolStrip控件——SplitButton

实例位置:光盘\ch02\2-33

范例说明

About the Example

范例讲解如何使用ToolStripSplitButton控件,程序运行效果如图2-59所示。

图2-59 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加RichTextBox,属性默认。

4.在窗体上添加ToolStrip,添加一个ToolStripButton,Text与ToolTipText属性均为“打开”。“打开”项的DisplayStyle属性为“Text”;另外添加一个ToolStripSplitButton,它的ToolStripMenuItem的Text分别为“25%”、“50%”、“100%”、“150%”和“200%”,其他属性默认。

5.运行程序,弹出图2-59所示的窗体,在工具栏上单击“打开”项,显示打开文件对话框,选中.txt文件,文件内容显示在RichTextBox中;单击“显示比例”项,RichTextBox中的内容将随着选择的比例修改字体的大小。

程序代码

Codes

“打开”文件

25%比例的Click事件:this.rchTextBoxContent.ZoomFactor = 0.25f;
50%比例的Click事件:this.rchTextBoxContent.ZoomFactor = 0.5f;
100%比例的Click事件:this.rchTextBoxContent.ZoomFactor = 1.0f;
150%比例的Click事件:this.rchTextBoxContent.ZoomFactor = 1.5f;
200%比例的Click事件:this.rchTextBoxContent.ZoomFactor = 2.0f;

抛砖引玉

About the Guidance

本范例在“打开”时,使用到系统的打开和保存文件对话框。显示比例的操作同Windows记事本的修改字体大小,设置的比例是全部文本的显示比例。

注意:

ToolStripButton的DisplayStyle属性需要读者按照所求进行修改,可以显示文本和图片。

范例2-34 ToolStrip控件——ComboBox

实例位置:光盘\ch02\2-34

范例说明

About the Example

范例讲解如何使用ToolStripComboBox控件,程序运行效果如图2-60所示。

图2-60 运行程序界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加RichTextBox,属性默认。

4.在窗体上添加ToolStrip,添加一个ToolStripComboBox,属性默认。

5.运行程序,弹出图2-60所示的窗体,在RichTextBox中选中输入的文本,单击工具栏上的下拉列表项,选择字体大小,RichTextBox中的内容将随着选择的比例,修改字体的大小。

程序代码

Codes

1.窗体加载

private void Form1_Load(object sender, EventArgs e)
{
    //初始化列表值,字体大小为6~24
    for (int i = 6; i < 25; i++)
    {
      this.toolStripComFontSize.Items.Add(i.ToString());
    }
    //默认选中字体大小是9
    this.toolStripComFontSize.SelectedText = "9";
}

2.修改字体大小

private void toolStripComFontSize_SelectedIndexChanged(object sender, EventArgs e)
{
    if (this.toolStripComFontSize.SelectedIndex != -1)
    {
              Single myFontSize =
              Convert.ToSingle(this.toolStripComFontSize.SelectedItem);
      if (rchTextFileContent.SelectionFont != null)
      {
          Font curFont = rchTextFileContent.SelectionFont;
              rchTextFileContent.SelectionFont = new Font(curFont.FontFamily,
              myFontSize, FontStyle.Regular);
      }
      else
      {
          int intPosition;
          int intLength;
          intPosition = rchTextFileContent.SelectionStart;
          intLength = rchTextFileContent.SelectionLength;
          //intSelectedNum为选中的字数,通过循环实现逐个字的字体改变
            for (int intSelectedNum = intPosition; intSelectedNum <=
            intPosition + intLength -1; intSelectedNum++)
          {
            rchTextFileContent.SelectionStart = intSelectedNum;
            rchTextFileContent.SelectionLength = 1;
            Font curFont = rchTextFileContent.SelectionFont;
                rchTextFileContent.SelectionFont = new Font(curFont.FontFamily,
                myFontSize, FontStyle.Regular);
          }
          intPosition = rchTextFileContent.SelectionStart;
          intLength = rchTextFileContent.SelectionLength;
      }
  }
}

抛砖引玉

About the Guidance

本范例的修改字体大小操作,类似Word工具栏上的修改字体大小功能。

技巧:

ToolStripComboBox的Item属性,是通过程序代码动态添加的,设置的字体大小为9~24之间。

范例2-35 ToolStrip控件——TextBox

实例位置:光盘\ch02\2-35

范例说明

About the Example

范例讲解如何使用ToolStripTextBox控件,程序运行效果如图2-61所示。

图2-61 运行程序

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加RichTextBox,属性默认。

4.在窗体上添加ToolStrip,添加一个ToolStripTextBox项,属性默认,另外添加一个ToolStripButton项,Image属性为“Windows查找图标”,ToolTipText属性为“查找”。

5.运行程序,在RichTextBox中选中输入的文本,在查找文本框中输入要查找的字符串,单击【查找】按钮,效果如图2-61所示。

程序代码

Codes

//用于保存上一次搜索的字符串
private string strOriginalFind = "";
//用于保存搜索的初始位置
private int intFindStartPosition = 0;
//查找
private void toolStripBtnFind_Click(object sender, EventArgs e)
{
    string strFindText = this.toolStripTxtFind.Text.Trim();
    if (strFindText != strOriginalFind)
    {
      //全局变量,用于保存搜索的初始位置
      intFindStartPosition = 0;
    }
    //确认已经选取搜索的字符串
    if (strFindText.Length > 0)
    {
      // 取得搜寻字符串位于RichTextBox控件中的位置。
            int intIndexOfText = this.rchTextFileContent.Find(strFindText,
            intFindStartPosition, RichTextBoxFinds.None);
      if (intIndexOfText >= 0)
      {
              intFindStartPosition = intIndexOfText +
              this.rchTextFileContent.SelectionLength;
      }
      else
      {
          MessageBox.Show("找不到字符串:\n" + strFindText);
      }
    }
}

抛砖引玉

About the Guidance

本范例重点告诉读者ToolStripTextBox控件的使用,在查找功能上只是实现了与查找字符串第一个相匹配的内容。读者可以自行推敲逻辑算法进行功能扩充。

范例2-36 DropDownButton的使用

实例位置:光盘\ch02\2-36

范例说明

About the Example

范例讲解如何使用ToolStripDropDownButton控件,程序运行效果如图2-62所示。

图2-62 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加RichTextBox,属性默认。

4.在窗体上添加ToolStrip,添加两个ToolStripDropDownButton项,Text与ToolTipText属性相同,分别为:“编辑”、“设置”。在编辑中添加“撤销”、“重做”、“复制”、“剪切”、“粘贴”项,在设置中添加“设置字体颜色”和“设置背景颜色”项。

5.运行程序,如图2-62所示,在RichTextBox中输入的文本,在编辑中对文本进行撤销、重做、复制、剪切、粘贴操作,同样可对于选中文本进行设置字体颜色,可以设置文本的背景颜色。

程序代码

Codes

1.撤销

this.rchTextBoxContent.Undo();

2.重做

this.rchTextBoxContent.Redo();

3.复制

this.rchTextBoxContent.Copy();

4.剪切

this.rchTextBoxContent.Cut();

5.粘贴

this.rchTextBoxContent.Paste();

6.设置字体颜色

private void tsmiSetFontColor_Click(object sender, EventArgs e)
{
    ColorDialog colorform = new ColorDialog();
    if (rchTextBoxContent.SelectedText.Length > 0)
    {
      colorform.Color = rchTextBoxContent.SelectionColor;
      if (colorform.ShowDialog() == DialogResult.OK)
      {
          rchTextBoxContent.SelectionColor = colorform.Color;
      }
    }
    else
    {
      MessageBox.Show("请选中文本,再设置字体颜色!");
}
}

7.设置背景色

pivate void tsmiSetBackColor_Click(object sender, EventArgs e)
{
    ColorDialog colorform = new ColorDialog();
    if (colorform.ShowDialog() == DialogResult.OK)
    {
      this.rchTextBoxContent.BackColor = colorform.Color;
    }
}

抛砖引玉

About the Guidance

通过以上一系列ToolStrip控件的操作,可以看出,RichTextBox的功能相当强大,对于文本的常用操作都包括在它的相关属性中,读者在学会使用工具栏的同时,也应掌握RichTextBox的功能。

范例2-37 StatusLabel

实例位置:光盘\ch02\2-37

范例说明

About the Example

范例讲解如何使用ToolStripStatusLabel控件,程序运行效果如图2-63所示。

图2-63 运行界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加ListView,Columns属性中添加“文件名”列,View属性为“Detail”,这个属性是默认属性。

4.在窗体上添加StatusStrip,添加两个ToolStripStatusLabel项,Text属性分别为“选中文件”、“未选中文件”,并且后者的IsLink属性为“True”。在窗体上添加两个Button控件,Text属性分别为“选择文件”和“关闭”。

5.运行程序,如图2-63所示,单击【选择文件】按钮,通过打开的对话框选择文件,此时状态栏便显示选中文件的全路径,直接单击链接即可执行文件打开的进程。

程序代码

Codes

1.选择文件

private void btnSelectFiles_Click(object sender, EventArgs e)
{
    OpenFileDialog fileform = new OpenFileDialog();
    fileform.Multiselect = true;
    if (fileform.ShowDialog() == DialogResult.OK)
    {
      this.lvwFiles.Items.Clear();
      foreach (string filename in fileform.FileNames)
      {
          ListViewItem item = new ListViewItem();
          item.Text = filename;
          this.lvwFiles.Items.Add(item);
      }
    }
}

2.选择列表中的文件

private void lvwFiles_SelectedIndexChanged(object sender, EventArgs e)
{
    foreach (ListViewItem item in this.lvwFiles.SelectedItems)
    {
      if (item != null)
      {
          this.tssLabFilePath.Text = item.Text;
      }
    }
}
单击状态栏上的链接打开文件
private void tssLabFilePath_Click(object sender, EventArgs e)
{
    if (this.tssLabFilePath.Text.Trim() == "未选中文件")
    {
      MessageBox.Show("无效文件!");
      return;
    }
    else
    {
      Process.Start("notepad.exe",this.tssLabFilePath.Text.Trim());
    }
}

3.关闭

this.Close();

技巧:

代码中“fileform.Multiselect = true;”表示选择文件时,支持多选文件同时添加到列表“Process.Start("notepad.exe",this.tssLabFilePath.Text.Trim());”启动记事本的执行进程。

范例2-38 记事本范例

实例位置:光盘\ch02\2-38

范例说明

About the Example

范例主要将常用的Winform控件综合起来使用,完成一个简单的文本编辑器的功能,程序运行效果如图2-64所示。

图2-64 运行程序界面

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.主窗体的界面如图2-64所示,考虑到读者已经熟悉之前的WinForm基本控件,这里不再赘述窗体的制作。

3.运行程序,如图2-64所示,操作列表中的目录文件夹,选择.txt文件,即可在右侧的列表中显示内容,随后便能对文本的内容进行编辑等操作,完成之后,即可掌握WinForm的常用控件。

程序代码

Codes

1.主窗体加载

private void frmMain_Load(object sender, EventArgs e)
{
    InitDriverRoot();
    InitTreeView();
}

2.初始化树视图控件

private void InitTreeView()
{
    DriveInfo[] driInfo = DriveInfo.GetDrives();
    TreeNode[] nodes = new TreeNode[driInfo.Length];
    for (int i = 0; i < driInfo.Length; i++)
    {
      nodes[i] = new TreeNode(driInfo[i].Name, 2, 2);
      //判断磁盘是否就绪
      if (driInfo[i].IsReady)
      {
          ConstructTreeNode(nodes[i]);
      }
    }
    this.treeViewFolder.Nodes.AddRange(nodes);
}

3.初始化磁盘的下拉框

private void InitDriverRoot()
{
    string[] strDrivers= Directory.GetLogicalDrives();
    if (strDrivers.Length > 0)
    {
      comBoxRoot.Items.AddRange(strDrivers);
      comBoxRoot.SelectedIndex = 0;
    }
}

抛砖引玉

About the Guidance

此范例,读者可以学习到Winform常用控件的相互操作和联系,并且能够对之前的单个控件知识进行很好的复习。

提示:

对于后台的逻辑读者可以根据源代码自行推敲。

2.2 数据显示控件

范例2-39 DataGrid中的数据绑定

实例位置:光盘\ch02\2-39

范例说明

About the Example

范例讲解如何使用DataGrid控件邦定数据,程序运行效果如图2-65所示。

图2-65 运行结果

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体MainForm,属性默认。

3.在窗体上添加DataGrid控件,属性默认。

4.在窗体上添加一个Button控件,它的Text属性分别为“数据绑定”。

5.运行程序,单击【数据绑定】按钮,出现图2-65所示的结果。

程序代码

Codes

【数据绑定】按钮事件

private void btnOK_Click(object sender, EventArgs e)
{
    //定义数据表
    DataTable dt = new DataTable();
    //新建列
    DataColumn col1 = new DataColumn("Name", typeof(string));
    DataColumn col2 = new DataColumn("Sex", typeof(string));
    DataColumn col3 = new DataColumn("Age", typeof(int));
    //向表中添加列
    dt.Columns.Add(col1);
    dt.Columns.Add(col2);
    dt.Columns.Add(col3);
    //新建行
    DataRow row1 = dt.NewRow();
    DataRow row2 = dt.NewRow();
    //给第一行数据赋值
    row1["Name"] = "zhouyao";
    row1["Sex"] = "男";
    row1["Age"] = 24;
    //给第二行数据赋值
    row2["Name"] = "zhangsan";
    row2["Sex"] = "男";
    row2["Age"] = 24;
    //向表中添加行
    dt.Rows.Add(row1);
    dt.Rows.Add(row2);
    //给DataGrid绑定数据
    this.dgDataBind.DataSource = dt;
}

抛砖引玉

About the Guidance

读者可以通过BindingSource控件设置DataGrid控件的DataSource属性以达到同样的效果。

提示:

DataGrid控件的DataSource属性可以通过读取数据库中的数据来设置。将数据库中的数据同样存入DataTable或者DataSet中,并赋值于DataSource属性即可。

范例2-40 DataGrid中的插入数据

实例位置:光盘\ch02\2-40

范例说明

About the Example

范例讲解如何使用DataGrid控件插入数据,程序运行效果如图2-66所示。

图2-66 运行程序结果

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加DataGrid控件,属性默认。

4.在窗体上添加一个Button控件,它的Text属性分别为“添加”。

5.在窗体上添加3个Label,Text属性分别为 “姓名”、“性别”、“年龄”,并添加文本框,性别右面添加两个RadioButton按钮,Text分别为 “男”、“女”。

6.运行程序,单击【添加】按钮,出现如图2-66所示的结果。

程序代码

Codes

//定义数据表(全局变量)
DataTable dt = new DataTable();

1.窗体Load事件

private void Form1_Load(object sender, EventArgs e)
{
    //新建列
    DataColumn col1 = new DataColumn("Name", typeof(string));
    DataColumn col2 = new DataColumn("Sex", typeof(string));
    DataColumn col3 = new DataColumn("Age", typeof(int));
    //向表中添加列
    dt.Columns.Add(col1);
    dt.Columns.Add(col2);
    dt.Columns.Add(col3);
    //新建行
    DataRow row1 = dt.NewRow();
    DataRow row2 = dt.NewRow();
    //给第一行数据赋值
    row1["Name"] = "zhouyao";
    row1["Sex"] = "男";
    row1["Age"] = 24;
    //给第二行数据赋值
    row2["Name"] = "zhangsan";
    row2["Sex"] = "男";
    row2["Age"] = 24;
    //向表中添加行
    dt.Rows.Add(row1);
    dt.Rows.Add(row2);
    Bind();
}

2.绑定数据

private void Bind()
{
    //给DataGrid绑定数据
    this.dgDataBind.DataSource = dt;
}

3.添加

private void btnAdd_Click(object sender, EventArgs e)
{
    if (this.txtName.Text.Trim() == "")
    {
      MessageBox.Show("请输入姓名!");
    }
    else if (!this.rbMale.Checked && !this.rbFemale.Checked)
    {
      MessageBox.Show("请选择性别!");
    }
    else
    {
      DataRow newrow = dt.NewRow();
      newrow["Name"] = this.txtName.Text.Trim();
      newrow["Age"]=this.txtAge.Text.Trim();
      if (this.rbMale.Checked)
      {
          newrow["Sex"] = this.rbMale.Text;
      }
      else
      {
          newrow["Sex"] = this.rbFemale.Text;
      }
      dt.Rows.Add(newrow);
      Bind();
    }
}

提示:

本范例的DataGrid控件的DataSource属性可以通过向数据库中插入数据来设置。

范例2-41 DataGrid中的更新数据

实例位置:光盘\ch02\2-41

范例说明

About the Example

范例讲解如何使用DataGrid控件更新数据,程序运行效果如图2-67所示。

图2-67 运行程序结果

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加DataGrid控件,属性默认。

4.在窗体上添加一个Button控件,它的Text属性为“更新”。

5.运行程序,在列表文本框中改变数据,单击【更新】按钮,出现如图2-67所示的结果。

程序代码

Codes

//定义数据表(全局变量)
DataTable dt = new DataTable();

1.窗体Load事件

private void Form1_Load(object sender, EventArgs e)
{
    //新建列
    DataColumn col1 = new DataColumn("Name", typeof(string));
    DataColumn col2 = new DataColumn("Sex", typeof(string));
    DataColumn col3 = new DataColumn("Age", typeof(int));
    //向表中添加列
    dt.Columns.Add(col1);
    dt.Columns.Add(col2);
    dt.Columns.Add(col3);
    //新建行
    DataRow row1 = dt.NewRow();
    DataRow row2 = dt.NewRow();
    //给第一行数据赋值
    row1["Name"] = "zhouyao";
    row1["Sex"] = "男";
    row1["Age"] = 24;
    //给第二行数据赋值
    row2["Name"] = "zhangsan";
    row2["Sex"] = "男";
    row2["Age"] = 24;
    //向表中添加行
    dt.Rows.Add(row1);
    dt.Rows.Add(row2);
    Bind();
}

2.邦定数据

private void Bind()
{
    //给DataGrid绑定数据
    this.dgDataBind.DataSource = dt;
}

3.更新

private void btnUpdate_Click(object sender, EventArgs e)
{
    MessageBox.Show("数据表已经跟新!");
}

提示:

本范例的DataGrid控件的DataSource属性也可以通过更新数据库中数据来设置。

范例2-42 DataGrid中的删除数据

实例位置:光盘\ch02\2-42

范例说明

About the Example

范例讲解如何使用DataGrid控件删除数据,程序运行效果如图2-68所示。

图2-68 运行程序结果

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加DataGrid控件,属性默认。

4.在窗体上添加一个Button控件,它的Text属性设为“删除”。

5.运行程序,选中列表中的行,单击【删除】按钮,出现图2-68所示的结果。

程序代码

Codes

//定义数据表(全局变量)
DataTable dt = new DataTable();

1.窗体Load事件

private void Form1_Load(object sender, EventArgs e)
{
    //新建列
    DataColumn col1 = new DataColumn("Name", typeof(string));
    DataColumn col2 = new DataColumn("Sex", typeof(string));
    DataColumn col3 = new DataColumn("Age", typeof(int));
    //向表中添加列
    dt.Columns.Add(col1);
    dt.Columns.Add(col2);
    dt.Columns.Add(col3);
    //新建行
    DataRow row1 = dt.NewRow();
    DataRow row2 = dt.NewRow();
    //给第一行数据赋值
    row1["Name"] = "zhouyao";
    row1["Sex"] = "男";
    row1["Age"] = 24;
    //给第二行数据赋值
    row2["Name"] = "zhangsan";
    row2["Sex"] = "男";
    row2["Age"] = 24;
    //向表中添加行
    dt.Rows.Add(row1);
    dt.Rows.Add(row2);
    Bind();
}

2.绑定数据

private void Bind()
{
    //给DataGrid绑定数据
    this.dgDataBind.DataSource = dt;
}

3.删除

private void btnDelete_Click(object sender, EventArgs e)
{
    if (dt.Rows.Count == 0)
    {
      return;
    }
    dt.Rows[this.dgDataBind.CurrentRowIndex].Delete();
}

提示:

本范例的DataGrid控件的DataSource属性也可以通过删除数据库中数据来设置。

范例2-43 DataGridView中的绑定数据

实例位置:光盘\ch02\2-43

范例说明

About the Example

范例讲解如何使用DataGridView控件邦定数据,程序运行效果如图2-69所示。

图2-69 运行程序结果

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加DataGridView控件,属性默认。

4.运行程序,出现图2-69所示的结果。

程序代码

Codes

//定义数据连接
SqlConnection conn = new SqlConnection("server=.\\sqlexpress;User
ID=sa;Password=20070604;database=Student;Integrated Security=true");
//定义数据表
DataTable dt = new DataTable();
窗体加载
private void Form1_Load(object sender, EventArgs e)
{
    try
    {
          conn.Open();
          SqlDataAdapter da = new SqlDataAdapter("select * from stuinfo", conn);
          da.Fill(dt);
          this.dataGridView1.DataSource = dt;
    }
    catch (Exception ex)
    {
          MessageBox.Show(ex.Message);
    }
    finally
    {
          conn.Close();
    }
}

提示:

本范例的DataGridView控件的DataSource属性可以通过读取数据库中数据和存入DataSet来邦定。

范例2-44 DataGridView中的插入数据

实例位置:光盘\ch02\2-44

范例说明

About the Example

范例讲解如何使用DataGridView控件插入数据,程序运行效果如图2-70所示。

图2-70 运行程序结果

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加DataGridView控件,属性默认。

4.在窗体中添加两个Label控件,Text属性分别为“姓名”和“性别”,在两个标签的右面分别放置文本框和单选按钮。单选按钮的Text属性分别为“男”和“女”。

5.运行程序,姓名为空时,弹出图2-71所示的提示框;插入成功时弹出图2-72所示的提示框,并且在图2-70所示的列表中添加一行新的数据。

图2-71 未输入姓名

图2-72 添加信息成功

程序代码

Codes

//定义数据连接
SqlConnection conn = new SqlConnection("server=.\\sqlexpress;User
ID=sa;Password=20070604;database=Student;Integrated Security=true");
//定义数据表
DataTable dt = new DataTable();

1.窗体加载

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
      conn.Open();
          SqlDataAdapter da = new SqlDataAdapter("select * from stuinfo", conn);
          da.Fill(dt);
      this.dataGridView1.DataSource = dt;
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message);
    }
    finally
    {
      conn.Close();
    }
}

2.绑定数据

private void Bind()
{
    this.dataGridView1.DataSource = dt;
}

3.添加事件

private void btnAdd_Click(object sender, EventArgs e)
{
    if (this.txtName.Text.Trim() == "")
    {
      MessageBox.Show("请输入姓名!");
  }
  else if (!this.rbMale.Checked && !this.rbFemale.Checked)
  {
      MessageBox.Show("请选择性别!");
  }
  else
  {
      string strSex=this.rbMale.Text;
      if(this.rbFemale.Checked)
      {
          strSex=this.rbFemale.Text;
      }
      try
      {
          conn.Open();
            string sql = "insert into stuinfo(Name,Sex)
            values('"+this.txtName.Text.Trim()+"','"+strSex+"')";
          SqlDataAdapter da = new SqlDataAdapter(sql,conn);
          MessageBox.Show("添加成功!");
      }
      catch (Exception ex)
      {
          MessageBox.Show(ex.Message);
          return;
      }
      finally
      {
          conn.Close();
      }
      DataRow newrow = dt.NewRow();
      newrow["Name"] = this.txtName.Text.Trim();
      newrow["Sex"] = this.rbMale.Text;
      if (this.rbFemale.Checked)
      {
          newrow["Sex"] = this.rbMale.Text;
      }
      dt.Rows.Add(newrow);
      Bind();
  }
}

抛砖引玉

About the Guidance

可以通过BindingSource控件设置DataGridView控件的DataSource属性达到同样的效果。

注意:

本范例的单选按钮默认值Text是“男”,通过程序逻辑判断来获取Text为“女”的值。

提示:

本范例的DataGridView控件的DataSource属性可以通过操作DataSet,向数据库中插入数据。

范例2-45 DataGridView中的更新数据

实例位置:光盘\ch02\2-45

范例说明

About the Example

范例讲解如何使用DataGridView控件更新数据,程序运行效果如图2-73和图2-74所示。

图2-73 运行程序界面

图2-74 更新信息

关键步骤

Key Steps

1.创建一个新的Windows工程。

2.创建窗体,属性默认。

3.在窗体上添加DataGridView控件,属性默认。

4.在窗体上添加按钮,Text属性为“更新”。

5.运行程序,在列表文本框中修改数据,单击【更新】按钮,弹出图2-74所示的信息框。

程序代码

Codes

//定义数据连接
SqlConnection conn = new SqlConnection("server=.\\sqlexpress;User
ID=sa;Password=20070604;database=Student;Integrated Security=true");
//定义数据表
DataTable dt = new DataTable();

窗体加载

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
      conn.Open();
      SqlDataAdapter da = new SqlDataAdapter("select * from stuinfo", conn);
      da.Fill(dt);
      this.dataGridView1.DataSource = dt;
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message);
    }
    finally
    {
        conn.Close();
    }
}

绑定数据

private void Bind()
{
    this.dataGridView1.DataSource = dt;
}

更新按钮

private void btnUpdate_Click(object sender, EventArgs e)
{
    //更新语句
    string strUpdate="update stuinfo set
    name='"+dt.Rows[this.dataGridView1.CurrentRow.Index]["Name"].ToString()
+"',sex='"+dt.Rows[this.dataGridView1.CurrentRow.Index]["Sex"].ToString()
+"' where no="+
Convert.ToInt32(dt.Rows[this.dataGridView1.CurrentRow.Index]["No"]);
    try
    {
      conn.Open();
      SqlCommand cmd = new SqlCommand(strUpdate, conn);
      int i= cmd.ExecuteNonQuery();
      if (i > 0)
      {
          MessageBox.Show("更新成功!");
      }
      else
      {
          MessageBox.Show("更新失败!");
      }
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message);
    }
    finally
    {
      conn.Close();
    }
}

抛砖引玉

About the Guidance

读者可以通过BindingSource控件设置DataGridView控件的DataSource属性达到同样的效果。

注意:

本范例的更新只能操作一条数据,如果更新多条数据需要修改逻辑。

提示:

本范例的DataGridView控件的DataSource属性可以通过操作DataSet,更新数据库中数据。

技巧:

操作数据库需要引用命名空间:“using System.Data.SqlClient;”,写SQL更新语句时,需要注意SQL语句的拼接技术。

范例2-46 DataGridView中的删除数据

实例位置:光盘\ch02\2-46

范例说明

About the Example

范例讲解如何使用DataGridView控件更新数据,程序运行效果如图2-75所示。

图2-75 运行程序界面

关键步骤

Key Steps

1.新建一个标准EXE工程。

2.创建窗体,属性默认。

3.在窗体上添加DataGridView控件,属性默认。

4.在窗体上添加按钮,Text属性为“删除”。

5.运行程序,选择一行,单击【删除】按钮,弹出图2-76所示的信息框。

图2-76 删除操作

程序代码

Codes

//定义数据连接
SqlConnection conn = new SqlConnection("server=.\\sqlexpress;User
ID=sa;Password=20070604;database=Student;Integrated Security=true");
//定义数据表
DataTable dt = new DataTable();

1.窗体加载事件

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
      conn.Open();
      SqlDataAdapter da = new SqlDataAdapter("select * from stuinfo", conn);
      da.Fill(dt);
      this.dataGridView1.DataSource = dt;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        conn.Close();
    }
}

2.绑定数据

private void Bind()
{
    this.dataGridView1.DataSource = dt;
}

3.删除数据

private void btnDelete_Click(object sender, EventArgs e)
{
    //删除语句
    string strDelete="delete from stuinfo where no=" +Convert.ToInt32
    (dt.Rows[this.dataGridView1.CurrentRow.Index]["No"].ToString());
    try
    {
      conn.Open();
      SqlCommand cmd = new SqlCommand(strDelete, conn);
      int i = cmd.ExecuteNonQuery();
      if (i > 0)
      {
          MessageBox.Show("删除成功!");
          dt.Rows[this.dataGridView1.CurrentRow.Index].Delete();
      }
      else
      {
          MessageBox.Show("删除失败!");
      }
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message);
    }
    finally
    {
      conn.Close();
    }
}

抛砖引玉

About the Guidance

读者可以通过BindingSource控件设置DataGridView控件的DataSource属性,达到同样的效果。

注意:

本范例只能删除一条数据,如果删除多条数据需要修改逻辑。

提示:

本范例的DataGridView控件的DataSource属性可以通过操作DataSet,删除数据库中数据。

2.3 本章小结

控件是Visual Studio的一大特色,控件可以极大地缩短编程的时间,可以以最快的速度实现常用的功能。特别是Visual Studio 2005中的控件得到了进一步的完善,更加智能化。熟练掌握控件是使用Visual Studio的必要条件。