第三章:菜单栏、工具栏及窗体布局

本章目标

  1. 掌握Windows常用的菜单控件和工具栏控件
  2. 会使用基本控件对窗体进行布局

本章内容

菜单和工具栏

1714810677914

菜单控件:MenuStrip

  1. 普通菜单项:ToolStripMenuItem

    命名规则:tsmi开头

    常用属性:

    DisplayStyle:显示方式(文本,图像或文本及图像)

    1. ImageAndText(默认)
    2. Image
    3. Text

    Image:图片

  2. 内容分割线:ToolStripSeparator

    为各级菜单添加分隔符

    img

  3. 菜单快捷键

    菜单的快捷键:&+字母,例如:&F

    ShortcutKeys:设置快捷键

    ShowShortcutKeys:是否显示快捷键

    1714812074204

工具栏:ToolStrip

作用:

在此容器中,我们可以添加多个子控件,按钮、标签、分割符、下拉框、文本框、进度条等控件,通常为与页面顶部,通过设置其Dock属性可以控制其横向排列、纵向排列等。

  1. 实现效果图:

1714812493030

  1. 控件效果:

1714812526546

  1. 常用属性:
属性名称 说 明
DisplayStyle 是否显示图像和文本
Image 将显示的图像
ImageScaling 是否调整图像大小
TextImageRelation 图像与文本的相对位置
  1. 多控件绑定同一事件:

    1714812791341

状态栏:StatusStrip

作用:

主要是用来展示程序运行时的信息的,通常位于整个页面的最底部,可以在控件中添加四种其他子控件:标签、进度条和两种按键,可以单独在在程序中编辑每一个子控件的信息值。

使用:

Word界面底部的信息展示栏就可以看作是StatusStrip控件。

img

具体实现:

1714813017698

快捷菜单:ContextMenuStrip

作用:

通常与某个控件的MouseDown(鼠标按下)事件绑定,然后显示一个菜单选项栏,以执行不同的操作。

1714813202030

注意事项:

当右键和那个控件关联,则设置该控件的ContextMenuStrip属性为指定右键菜单关联。

或代码实现关联绑定,在指定控件的MouseClick事件中写下如下代码:

1
2
3
4
5
6
7
private void FrmAdd_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
contextMenuStrip1.Show(MousePosition.X,MousePosition.Y);
}
}

布局窗体中的控件

  1. 为什么要布局窗体?

    不美观,不友好,如下图:

    1714813762078

  2. 用VS排列窗体的控件

    工具:Visual Studio的“格式” 菜单

    1714813865761

  3. 锚定控件:Achor属性

    作用:

    固定控件与窗体边缘的距离。

    1714813963334

    经验:

    按住Ctrl键选择多个控件,再设置Anchor属性,可以一次锚定多个控件

  4. 停靠控件:Dock

    作用:

    将控件停靠在窗体的边缘或填充窗体。

    1714814126878

    经验:

    当某控件需要充满整个窗体时,设置控件的Dock属性是最快捷的方式

MDI模式窗体

  1. 作用:

    在 MDI 应用程序中可以同时打开多个文件

    1714814257114

  2. 创建步骤:

    1. 创建父窗体,设置父窗体的 IsMDIContainer 属性设为true,可见窗体效果有变化。

      1714814626862

    2. 子窗体的 MdiParent 属性设为父窗体

      1
      2
      3
      4
      //打开学生管理
      FrmStudent frm = new FrmStudent();
      frm.MdiParent = this;//指定打开窗体的父窗体为本窗体
      frm.Show();

      注意:

      在MDI模式中,不能使用ShowDialog()方法,会报错。

    3. 建立子窗体窗口列表的步骤

      设置父窗体菜单控件的 MdiWindowListItem 属性,选定为“窗口”菜单项

    4. 问题:如何关闭父窗体中打开的所有子窗体?

      1
      2
      3
      4
      5
      6
      7
      private void tsmiClose_Click(object sender, EventArgs e)
      {
      foreach (Form frm in this.MdiChildren)//可循环获取MDI的子窗体
      {
      frm.Close();//关闭窗体
      }
      }

ADO.NET实现具体操作

  1. 功能描述:实现对管理员的添加功能

    1. 设置界面,界面如下:

      1714816123587

    2. 给“添加按钮”加入点击事件:

      1. 实现验证功能(非空验证)

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        /// <summary>
        /// 写一个验证方法,验证界面输入
        /// </summary>
        /// <returns></returns>
        private bool CheckInput()
        {
        if (txtLoginId.Text.Trim() == "")
        {
        MessageBox.Show("请输入账号!", "验证提示");
        txtLoginId.Focus();
        return false;
        }
        if (txtPwd.Text.Trim() == "")
        {
        MessageBox.Show("请输入密码!", "验证提示");
        txtLoginId.Focus();
        return false;
        }
        return true;
        }

        1714816779210

      2. 实现添加功能:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        private void btnAdd_Click(object sender, EventArgs e)
        {
        if (CheckInput()==true)//验证成功,则实现添加功能
        {
        //ADO.NET实现增加
        string connString = "server=.;database=MySchool;uid=sa;pwd=sa;";
        using (SqlConnection conn = new SqlConnection(connString))
        {
        conn.Open();
        string sql = "insert into Admin(LoginId,LoginPwd)values(@LoginId,@LoginPwd)";
        SqlCommand cmd = new SqlCommand(sql, conn);

        SqlParameter[] sqlParameters = {
        new SqlParameter("@LoginId", txtLoginId.Text),
        new SqlParameter("@LoginPwd",txtPwd.Text)
        };
        cmd.Parameters.AddRange(sqlParameters);//添加参数

        int count=cmd.ExecuteNonQuery();

        if(count > 0)
        {
        MessageBox.Show("添加成功");
        }
        else
        {
        MessageBox.Show("添加失败");
        }
        }
        }
        }

ComboBox数据填充

  1. 问题:如何读取年级信息添加到年级组合框中?如下图:

    1714817296183

  2. 具体实现方式有二种

    1. 方式一:

      处理窗体的Load事件使用DataReader读取年级记录添加ComboBox的项

      cboGrade.Items.Add( 要添加的项 );

      在第一项位置增加“请选择”的提示

      cboGrade.Items.Add("请选择");

      具体实现:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      private void FrmStudent2_Load(object sender, EventArgs e)
      {
      string connString = "server=.;database=MySchool;uid=sa;pwd=sa;";
      using (SqlConnection conn = new SqlConnection(connString))
      {
      conn.Open();
      string sql = "select gradeId,gradeName from Grade";
      SqlCommand cmd = new SqlCommand(sql, conn);
      SqlDataReader sqlDataReader = cmd.ExecuteReader();

      while (sqlDataReader.Read())
      {
      cboGrade.Items.Add(sqlDataReader["gradeName"]);
      }

      sqlDataReader.Close();
      }
      }

      问题:如何要获取年级的主键GradeId进行操作,则又要从数据库查询出来,则比较麻烦,此方式不推荐。

    2. 方式二:

      1. 加载数据,通过DataTable方式实现:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        private void FrmStudent2_Load(object sender, EventArgs e)
        {
        DataTable dt = new DataTable();
        string connString = "server=.;database=MySchool;uid=sa;pwd=sa;";
        using (SqlConnection conn = new SqlConnection(connString))
        {
        conn.Open();
        string sql = "select gradeId,gradeName from Grade";
        SqlDataAdapter sda=new SqlDataAdapter(sql,conn);
        sda.Fill(dt);//填充表格

        cboGrade.DisplayMember = "gradeName";//指定下拉列表显示数据的列名
        cboGrade.ValueMember = "gradeId";//指定下拉列表值的列名
        cboGrade.DataSource = dt;//将表格数据绑定到下拉列表的数据源里

        }
        }

      2. 获取绑定的Value

        1
        cboGrade.SelectedValue;

课后作业

1.实现学生登录功能(跳转到MDI主窗体)

2.实现查看所有学生信息
包含:学号、姓名、性别、身份证
显示方式:RichTextBox
查询方式:读取器

3.实现删除科目
显示:组合框显示科目信息
提示:获取选中的值进行删除