Winform—常用控件、属性、事件详情介绍

Winform---常用控件、属性、事件详情介绍

Winform控件是可再用的组件,封装了用户界面功能,并且可以用于客户端 Windows 应用程序。Windows 窗体不仅提供了许多现成控件,还提供了自行开发控件的基础结构。可以组合现有控件、扩展现有控件或创作自己的自定义控件

本篇就为大家分享一下Winform中常用的控件和属性以及事件的详细介绍,非常适合初学者,和复习者。

本篇包含Winform三十一个控件以及属性和事件的介绍。


目录

Winform---常用控件、属性、事件详情介绍

Winform---常用控件

[1.Form 窗体组件](#1.Form 窗体组件)

[常用属性 :](#常用属性 :)

[2.lable 用于显示文字](#2.lable 用于显示文字)

常用属性

[3.textBox 输入框](#3.textBox 输入框)

常用的属性

[4.Button 按钮](#4.Button 按钮)

常用属性

[5. panel 面板](#5. panel 面板)

常用属性

[6. checkBox 多选框](#6. checkBox 多选框)

常用的属性

[7.RadioButton 单选框](#7.RadioButton 单选框)

常用属性

[8.pictureBox 显示图片](#8.pictureBox 显示图片)

常用属性

[9.TaBControl 选项卡](#9.TaBControl 选项卡)

常用属性

[10.ComboBox 下拉菜单](#10.ComboBox 下拉菜单)

常用属性

通过代码添加下拉内容

[如果需要添加多个元素 可以放进数组进行遍历](#如果需要添加多个元素 可以放进数组进行遍历)

[11.DateTimePicker 选择日期和时间](#11.DateTimePicker 选择日期和时间)

常用属性

自定义时间格式

具体设置日期显示方式

[12.DataGridView 表格](#12.DataGridView 表格)

常用属性

用法

添加

查询

删除

绘制表格

绘制表格行号

给单元格添加Click事件

表格的数据源的几种的形式的区别

[13. richTextBox 富文本](#13. richTextBox 富文本)

用法

[14. timer 定时器](#14. timer 定时器)

常用属性

使用

[15. progressBar 进度条](#15. progressBar 进度条)

常用属性

[16. SplitContainer 分割容器](#16. SplitContainer 分割容器)

常用属性

[17.MonthCalendar 日历](#17.MonthCalendar 日历)

[18. MenuStrip 导航菜单](#18. MenuStrip 导航菜单)

常用属性

设置快捷方式

[19. contexMenuStrip 右键菜单](#19. contexMenuStrip 右键菜单)

使用方法

[20.statusStrip 状态菜单栏](#20.statusStrip 状态菜单栏)

常用属性:

[21. GroupBox 在组件周围显示一个带有标题的框架](#21. GroupBox 在组件周围显示一个带有标题的框架)

[22. NumericUpDown 显示用户通过单击空间上的上下按钮可以增加和减少的单个数值](#22. NumericUpDown 显示用户通过单击空间上的上下按钮可以增加和减少的单个数值)

[23. maskedTextBox1 输入框(用于区分输入格式)](#23. maskedTextBox1 输入框(用于区分输入格式))

[24. FlowLayoupanel 容器 它与panel的区别是它可以把子组件进行自动排列](#24. FlowLayoupanel 容器 它与panel的区别是它可以把子组件进行自动排列)

[25. imagelist组件 是一个存储图片的集合](#25. imagelist组件 是一个存储图片的集合)

常用属性

手搓属性

26.listview 以五种不同视图中的一种显示项的集合

[26. listbox 使用于显示一组选项,并且可以使用用户进行选择](#26. listbox 使用于显示一组选项,并且可以使用用户进行选择)

使用方法

[27. trackbar组件 用于调整音量](#27. trackbar组件 用于调整音量)

[28. axWindowsMediaPlayer1组件 音乐播放器](#28. axWindowsMediaPlayer1组件 音乐播放器)

播放音乐

歌曲进度

播放音量

播放状态

暂停播放

[29. ColorDialog 表示一个通用对话框,该对话框显示可用的颜色以及允许用户定义自定义颜色的控件。](#29. ColorDialog 表示一个通用对话框,该对话框显示可用的颜色以及允许用户定义自定义颜色的控件。)

使用方法:

[30. OpenFileDialog 显示一个标准对话框,提示用户打开文件。 此类不能被继承。](#30. OpenFileDialog 显示一个标准对话框,提示用户打开文件。 此类不能被继承。)

使用方法

[31.ColorDialog 字体对话框](#31.ColorDialog 字体对话框)

Winform常用事件

[Click 点击](#Click 点击)

[MouseEnter 鼠标移入](#MouseEnter 鼠标移入)

[MouseLeave 鼠标移开](#MouseLeave 鼠标移开)

[MouseMove 鼠标移动](#MouseMove 鼠标移动)

[MouseUp 鼠标移开](#MouseUp 鼠标移开)

[FormLoad 窗体加载事件](#FormLoad 窗体加载事件)

FormClosing(窗体正在关闭时显示)

Activated(窗体被激活时)

SizeChanged(窗体Size属性更改时)

Resize(调整窗体大小时)

LocationChanged(Location属性更改时)

[TextChanged 输入框输入内容改变的事件](#TextChanged 输入框输入内容改变的事件)

[SelectedChanged 选中状态变化的事件](#SelectedChanged 选中状态变化的事件)

[FormClosing 正在关闭时候触发](#FormClosing 正在关闭时候触发)

[KeyDown 键盘按下触发](#KeyDown 键盘按下触发)

[KeyUp 松开按键触发](#KeyUp 松开按键触发)

[KeyPress 键盘按压触发](#KeyPress 键盘按压触发)

[CheckedChanged 当单选框或多选框,选项发生变化时触发](#CheckedChanged 当单选框或多选框,选项发生变化时触发)

[Tick 定时器事件,当定时器改变时触发](#Tick 定时器事件,当定时器改变时触发)

ValueChanged事件是trackbar组件的事件

[PlayStateChange事件,作用: 监听axWindowsMediaPlayer组件播放音乐](#PlayStateChange事件,作用: 监听axWindowsMediaPlayer组件播放音乐)

SelectedIndexChanged事件,当listbox组件选项发生改变时触发

Paint事件,当组件从新绘制时触发


Winform---常用控件

1.Form 窗体组件

##### 常用属性 :

> * AutoScaleMode 确定当屏幕分辨率或字体更改是窗体或控件将如何缩放
>
> * text 标题
>
> * MaximizeBox: 窗口是否可以最大化
>
> * MinimizeBox: 窗体是否可以最小化
>
> * WindowState: 窗体初始化的大小, Normal正常,Maximized最大化,Minimized最小化
>
> * StartPostion: 窗体开始运行出现的位置
>
> * FormBorderStyle: 窗体的边框样式: None无边框 FixedSingle窄边框,单框 FixedDialog窗体体边框的风格改为和对话框的风格 fixed3d窗体风格设为3d SizeAble正常的窗体样式
>
> * icon: 窗体图标 必须是ico的格式
>
> * Size属性: 窗体的大小,可以直接修改
>
> * Font 字体大小
>
> * fontcolor 字体颜色

2.lable 用于显示文字

##### 常用属性

> * Name: 指的控件的唯一的表示 类似id属性,每一个控件Nmae不能冲突
>
> * Text:设置文本内容
>
> * autoSize: 是否可以设置大小 true 不能设置lable的大小 ; false 可以设置大小宽度和高度
>
> * TextAlign: 对齐方式
>
> * ForeColor: 字体颜色
>
> * font: 设置字体(大小,规范)
>
> * backColor: 背景颜色
>
> * borderstyle:边框类型
>
> * cursor: 鼠标样式
>
> * Anchor :设置锚点

3.textBox 输入框

##### 常用的属性

> * PassWordChar: 密码加密
>
> * Multiline: 设置输入单行或多行
>
> * maxLength: 设置输入框内可以输入多少内容
>
> * ReadOnly: 只读属性 true 不能输入 false 可以输入

4.Button 按钮

##### 常用属性

> * Backgroundmage 设置窗体背景图片
>
> * FlatStyle 设置按钮边框样式

5. panel 面板

##### 常用属性

> * bordercolor 边框
>
> * Font 字体大小
>
> * size面积
  • (panel也被称为容器,此组件内可以放置其他组件)

6. checkBox 多选框

##### 常用的属性

> * checked: 是否选中
>
> * checkalign 对齐方式
>
> * threState: 多选框形态
>
> * FlatStyle 设置选项选中样式
  • 多选框和单选框一般需要在panel组件内使用

7.RadioButton 单选框

##### 常用属性

*
  > checked: 是否选中状态

8.pictureBox 显示图片

##### 常用属性

> * SizeMode 图片显示方式
>
> * image 添加图片
  • 通过代码添加图片

    • 普通路径 img.Image = Image.FromFile("路径");

    • 网络路径 this.pictureBox1.ImageLocation = (list[Count]);

9.TaBControl 选项卡

##### 常用属性

*
  > TabPages 添加选项卡

10.ComboBox 下拉菜单

##### 常用属性

*
  > items 添加下拉内容
##### 通过代码添加下拉内容

*
  > this.comboBox1.Items.Add("山东省");
*

  ##### 如果需要添加多个元素 可以放进数组进行遍历
      • string[] strings = new string[] { "新疆省", "福建省" };

      • for (int i = 0; i < strings.Length; i++) { this.comboBox1.Items.Add(strings[i]); }

    • 选中下拉内容的索引值 this.comboBox1.SelectedIndex = 0;

11.DateTimePicker 选择日期和时间

##### 常用属性

> * formation 日期格式
>
>   * 1 Long: 长日期时间格式 比如: 2023年10月2日
>
>   * 2 Short: 短日期格式 比如: 2023/10/2
>
>   * 3 time: 时间日期格式 比如:11:05
>
>   * 4 custom: 自定义时间格式 以自己设置显示方式显示时间
>
> * Value 初始日期
##### 自定义时间格式

> * // 先将日期格式设为自定义
>
> * this.dateTimePicker1.Format = DateTimePickerFormat.Custom; // 具体设置日期显示方式 字符串格式
>
> * this.dateTimePicker1.CustomFormat = "MMMM dd ,yyy-ddd";
##### 具体设置日期显示方式

*
  > this.dateTimePicker1.CustomFormat = "MMMM dd ,yyy-ddd";

12.DataGridView 表格

##### 常用属性

> * AllowUserToDeleteRows 是否显示多余的一行
>
> * ScrollBars 滚动条
>
> * Columns 设置标题属性
>
> * RowHeadersVisible 指示是否显示包含行标题的列。
##### 用法

*

  ###### 添加

  *
    > 一次性添加一整行:
    >
    > this.dataGridView1.Rows.Add(new string\[\] { 元素1, 元素2, 元素3, 元素4 });
  *
    > 一次添加一个单元格:
    >
    > int index =this.data1.Rows.Add(); (需要先获取索引) this.dataGridView1.Rows\[index\].Cells\[0\].Value = 元素; (添加)
*

  ###### 查询

  *
    > 单个查询:
    >
    > dataGridView1.Rows\[0\].Cells\[0\].value (如果需要查询所有元素的话可以使用双重循环)
  *
    > 找到当前选中的一行的索引:
    >
    > dataGridView1.CurrentRow.Index
*

  ###### 删除

  *
    > 删除一行: dataGridView1.Rows.RemoveAt(dataGridView1.CurrentRow.Index);
  *
    > 删除所有的行: dataGridView1.Rows.Clear();
  *
    > 删除所有的列: dataGridView1.Columns.Clear()
*

  ###### 绘制表格

  * 方法

    *

      ```cs
      public static void DgvStyle1(DataGridView dgv)
              {
                  // 未显示数据时候背景颜色
                  dgv.BackgroundColor = System.Drawing.SystemColors.ButtonFace;

                  // 显示数据时候背景颜色
                  dgv.RowsDefaultCellStyle.BackColor = System.Drawing.Color.Black;

                  // 设置网格的颜色
                  dgv.GridColor = System.Drawing.Color.Red;

                  // 设置列表题边框的模式
                  dgv.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;

                  // 设置行的边框模式
                  dgv.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;

                  // 表格的默认样式不可见
                  dgv.EnableHeadersVisualStyles = false;

                  dgv.ForeColor = Color.White;

                  // 设置列的宽度高度 单位是px
                  dgv.ColumnHeadersHeight = 35;

                  // 设置列标题宽度可以被修改
                  dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;

              }
      ```

  * 使用

    *
      > 使用的时候直接在构造函数中调用该方法就行 参数是需要绘制的表格 DgvStyle1(this.dataGridView1);
*

  ###### 绘制表格行号

  * 方法

    ```cs
    // 给表格添加行号
    public static void DgvRowCount(DataGridView dgv,DataGridViewRowPostPaintEventArgs e)
            {
                // 设置一个笔刷 包含绘制图形的样式,带了表格行的默认字体颜色
                SolidBrush s1 = new SolidBrush(dgv.RowHeadersDefaultCellStyle.ForeColor);
                // 行号
                int num = e.RowIndex + 1;
                string numstring = num.ToString();
                // DrawString 绘制字符串
                e.Graphics.DrawString(numstring,e.InheritedRowStyle.Font,s1,e.RowBounds.Location.X+15,e.RowBounds.Location.Y +5);
            }
    ```

  * 使用

    * 使用的时候需要在该表格中添加一个RowPostPaint事件,在该事件中调用行号的方法(当表格添加一次数据调用一次该方法)

    *

      ```cs
      private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 
      { Common.DatagridviewStyle.DgvRowCount(dataGridView1, e); }
      ```

*

  ###### 给单元格添加Click事件

  ```cs
  // 第一步添加给表格添加CellClick单元格点击事件

  // 第二步在事件中判断点击的是那个单元格
  private async void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
  {
      if (e.ColumnIndex == dataGridView1.Columns["Column5"].Index && e.RowIndex >=0)
      {
          button1_Click(null, null);
      }
      else if (e.ColumnIndex == dataGridView1.Columns["Column4"].Index && e.RowIndex >= 0)
      {
          button1_Click(null, null);
      }
  }
  ```
##### 表格的数据源的几种的形式的区别

* 1 List泛型集合数据 (使用此方法给表格赋值时需要将表格中columns集合中的属性值修改与表格相对应) dataGridView1.DataSource = list

  *
    > 使用方法: this.dataGridView1.DataSource = list
* 2 dataSet数据集 里面有DataTable属性, 如果有俩个select数据,就会出现2个DataTable,一般情况下都是 使用一个select,所以一般从dataSet.Tables\[0\],取出数据源即可 可以RowFiter方法对dataset数据进行过滤,按照一定条件进行筛选想要的数据 例如 按照班级筛选成绩,按照大小进行筛选 dataGridView1.DataSource = dataSet.Tables\[0\]

  *
    > 使用方法: this.dataGridView1.DataSource = this.ds.Tables\[0\];

13. richTextBox 富文本

##### 用法

* 如果需要在中端修改组件属性则需要创建一个对话框的对象 字体对话框对象:

*
  > FontDialog f = new FontDialog();
  >
  > f.ShowDialog()==DialogResult.ok
* 字体颜色对话课对象:

*
  > ColorDialog c = new ColorDialog();
  >
  > c.ShowDialog()====DialogResult.ok
* 选中字体的颜色 SelectionColor

* 选中字体的背景颜色 SelectionBackColor

* 选中文本的字体 SelectionFont

14. timer 定时器

##### 常用属性

> * interval 定时器间隔 (单位是毫秒)
>
> * Enabled 是否启动定时器
##### 使用

> * this.timer1.Stop(); // 关闭定时器
>
> * this.timer1.Start(); // 开启定时器
>
> * this.timer1.Interval = 1000; // 修改执行的频率(每隔一秒执行)

15. progressBar 进度条

##### 常用属性

> * Value 进度值
>
> * Maximum 设置进度条的最大值
>
> * Minimum 设置进度条的最小值
>
> * Step 进度条的递增量

16. SplitContainer 分割容器

##### 常用属性

*
  > FixedPanel 选中那个窗体那个窗体不会改变大小
  • 作用:

    • 把窗体一分为二,可以放置其他的组件在两个容器里面

17.MonthCalendar 日历

##### 常用属性

*
  > items 设置菜单的标题的集合
  > * Alignment 设置菜单的排列方式
  >
  > * margin 外边距
  >
  > * padding 内边距
  >
  > * image 设置图标
  >
  > * imageAlign 设置图标排列方式
##### 设置快捷方式

*
  > 点击打卡DropDwnItems集合属性,找到需要添加快捷键的按钮,然后找到ShortcutKeys属性 添加快捷按键

19. contexMenuStrip 右键菜单

##### 使用方法

*
  > 把右键菜单拖拽到窗体上,添加菜单标题,选中label控件(也可以是其他控件),在属性面板里面找到contextmenustrip属性选择对应菜单即可

20.statusStrip 状态菜单栏

##### 常用属性:

*
  > Items 属性集合 可以在集合内设置其他组件
  > * progressBar 进度条
  >
  > * StatusLabel 显示文本
  >
  > * DropDownButton 按钮图标
  >
  > * splitButton 菜单图标
  • 作用

    • 默认在窗体最下面 可以设置进度条 也可以添加下拉按钮,也可以添加文本等待

21. GroupBox 在组件周围显示一个带有标题的框架

22. NumericUpDown 显示用户通过单击空间上的上下按钮可以增加和减少的单个数值

23. maskedTextBox1 输入框(用于区分输入格式)

24. FlowLayoupanel 容器 它与panel的区别是它可以把子组件进行自动排列

25. imagelist组件 是一个存储图片的集合

  • this.listView1.View = View.LargeIcon; // 设置listview展示风格为大图标风格。

  • this.listView1.LargeImageList = this.imageList1; // listview图标的来源

  • this.listView1.SmallImageList = this.imageList1; // 设置小图标风格

26.listview 以五种不同视图中的一种显示项的集合

##### 常用属性

* 通过view属性设置listview组件的五种风格

  > * 1 Largelcon 每个项都为一个最大化图标,在图标下面有一行文字标题
  >
  > * 2 Smalllcon 每个项为一个最小化的图标,在图标右面有一行文字标题
  >
  > * 3 Details 每个项显示不同行上,并带有关于列中所有排列的进一步信息,最左边的列包含了一个小图标和标签
  >
  > * 4 list 每个项都为一个小图标 右边有一个标签,各项排列在列中 没有列标头
  >
  > * 5 Tile每一项都显示一个完整大小的图标,
##### 手搓属性

> * this.listView1.GridLines = true; // 在行与列之间是否显示网格线
>
> * this.listView1.CheckBoxes = true; // 选项框
>
> * 添加列标题 clumns 列 this.listView1.Columns.Add("学生学号");
>
> * this.listView1.Columns\[0\].Width = 200; // 设置列宽度,第二列宽度
>
> * items.add() 添加一个新行 给新行添加子元素的时候 通过 Subltems.Add() 添加 this.listView1.Items.Add("001"); this.listView1.Items\[0\].SubItems.Add("张三");
>
> * // 创键一行的对象 ListViewItem li = new ListViewItem("003"); li.SubItems.Add("王五");

26. listbox 使用于显示一组选项,并且可以使用用户进行选择

##### 使用方法

> * item属性
>
>   * Items 属性是 ListBox 中的所有选项集合,我们可以通过以下方式将选项添加到 ListBox 中
>
>   * 添加单个选项: listBox1.Items.Add("选项1");
>
>   * 添加多个选项: string\[\] items = { "选项2", "选项3", "选项4" }; listBox1.Items.AddRange(items);
>
>   * // 遍历获取 ListBox 中已选中的所有选项 foreach (var item in listBox1.SelectedItems) { // item 为 ListBox 中一项选项的信息 }
>
> * SelectedIndex属性
>
>   * SelectedIndex 属性是 ListBox 中已选中选项的索引值。当用户选中 ListBox 中的某个选项时,该属性会更新为所选项的索引值。
>
>   * // 获取当前 ListBox 所选项的索引值 int selectedIndex = listBox1.SelectedIndex;
>
> * SelectedItems属性
>
>   * // 获取当前 ListBox 所选项的文本信息 string selectedItem = listBox1.SelectedItem.ToString();

27. trackbar组件 用于调整音量

28. axWindowsMediaPlayer1组件 音乐播放器

  • 此组价需要导入第三方库方可使用:

    // 1 引用-->添加引用-->com类型库--->window media player

    // 2 随意找一个控件右键 选择项--com组件---window media player 点击确定

    //3 在工具箱搜索window media player

##### 播放音乐

*
  > this.axWindowsMediaPlayer1.URL = "路径"; //获取路径 this.axWindowsMediaPlayer1.Ctlcontrols.play();// 播放
##### 歌曲进度

> * this.axWindowsMediaPlayer1.Ctlcontrols.currentPosition; // 当前进度
>
> * this.axWindowsMediaPlayer1.currentMedia.duration// 歌曲总进度
##### 播放音量

*
  > axWindowsMediaPlayer1.settings.volume // 代表音量
##### 播放状态

* axwindowmediapalyer 播放器 默认有这几个状态 (playState 播放器的状态)

*
  > // 播放状态: playState=3
  >
  > // 暂停状态 playState=2
  >
  > // 停止状态 playState=1
  >
  > //正在缓存 playState=6 /
  >
  > / 播放结束 playState=8
##### 暂停播放

*
  > this.axWindowsMediaPlayer1.Ctlcontrols.pause(); //暂停播放

29. ColorDialog 表示一个通用对话框,该对话框显示可用的颜色以及允许用户定义自定义颜色的控件。

##### 使用方法:

*
  > DialogResult r = colorDialog1.ShowDialog(); // 显示对话框
  >
  > if (r == DialogResult.OK) // 判断用户是否点击ok
  >
  > { this.BackColor = colorDialog1.Color; // 获取设置的颜色 }

30. OpenFileDialog 显示一个标准对话框,提示用户打开文件。 此类不能被继承。

##### 使用方法

*
  > DialogResult r = openFileDialog1.ShowDialog(); // 显示对话框
  >
  > if (r == DialogResult.OK) // 判断用户是否点击确定
  >
  > { MessageBox.Show(openFileDialog1.FileName.ToString()); // 获得选择的文件路径 }

31.ColorDialog 字体对话框


Winform常用事件

##### Click 点击
#### MouseEnter 鼠标移入
##### MouseLeave 鼠标移开
##### MouseMove 鼠标移动
##### MouseUp 鼠标移开
##### FormLoad 窗体加载事件
##### FormClosing(窗体正在关闭时显示)
##### Activated(窗体被激活时)
##### SizeChanged(窗体Size属性更改时)
##### Resize(调整窗体大小时)
##### LocationChanged(Location属性更改时)
##### TextChanged 输入框输入内容改变的事件
##### SelectedChanged 选中状态变化的事件
##### FormClosing 正在关闭时候触发
##### KeyDown 键盘按下触发
##### KeyUp 松开按键触发
##### KeyPress 键盘按压触发
##### CheckedChanged 当单选框或多选框,选项发生变化时触发
##### Tick 定时器事件,当定时器改变时触发
##### ValueChanged事件是trackbar组件的事件
##### PlayStateChange事件,作用: 监听axWindowsMediaPlayer组件播放音乐
##### SelectedIndexChanged事件,当listbox组件选项发生改变时触发
##### Paint事件,当组件从新绘制时触发

本篇文章到此结束,转载请附上原创网址,谢谢!!!

相关推荐
轻口味20 分钟前
【每日学点鸿蒙知识】AVCodec、SmartPerf工具、web组件加载、监听键盘的显示隐藏、Asset Store Kit
前端·华为·harmonyos
alikami23 分钟前
【若依】用 post 请求传 json 格式的数据下载文件
前端·javascript·json
yngsqq34 分钟前
一键打断线(根据相交点打断)——CAD c# 二次开发
windows·microsoft·c#
吃杠碰小鸡1 小时前
lodash常用函数
前端·javascript
emoji1111111 小时前
前端对页面数据进行缓存
开发语言·前端·javascript
泰伦闲鱼1 小时前
nestjs:GET REQUEST 缓存问题
服务器·前端·缓存·node.js·nestjs
m0_748250031 小时前
Web 第一次作业 初探html 使用VSCode工具开发
前端·html
TENET信条1 小时前
day53 第十一章:图论part04
开发语言·c#·图论
一个处女座的程序猿O(∩_∩)O1 小时前
vue3 如何使用 mounted
前端·javascript·vue.js
m0_748235951 小时前
web复习(三)
前端