一、知识点描述
1.下拉框(ComboBox)
显示一个可编辑的文本框,其中包含一个允许值下拉列表。
2.文本框(TextBox)
允许用户输入文本,并提供多行编辑和密码字符掩码功能。
3.单选按钮(RadioButton)
当与其他单选按钮成对出现时,允许用户从一组选项中选择单个选项。
4.日期控件(DateTimePicker)
允许用户选择日期和时间,并以指定的格式显示该日期和时间。
5.图像框(PictureBox)
指定支持事务处理初始化,允许用户加载图片。
6.网格视图(DataGridView)
是一类图形控件用来网格方式显示数据。
二、思维导图
三、实例代码与效果截图
1.输入数据
①下拉框(ComboBox)
下拉框中可以写入数据,并选择,如下图:
this.Patient.IfChronic = this.cmb_IfChronic.Text.Trim();
②文本框(TextBox)
文本框中直接输入值,如下图:
向SQL命令的参数集合添加参数的名称、值(即文本框中的值);
sqlCommand.Parameters.AddWithValue("@No", this.txb_No.Text.Trim()); //输入文本框数据(账号)
sqlCommand2.Parameters.AddWithValue("@Password", this.txb_Password.Text.Trim()); //输入文本框数据(密码)
调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
int rowAffected = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
③单选按钮(RadioButton)
选中单选按钮,如下图:
向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters.AddWithValue("@Gender", this.rdb_Female.Checked);//输入单选按钮的值
调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
int rowAffected = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
④日期控件(DateTimePicker)
选中日期控件中的一个日期,如下图:
向SQL命令的参数集合添加参数的名称、值;
sqlCommand.Parameters.AddWithValue("@BirthDate", this.DateTimePicker1.Value);//输入日期控件中的数据
调用SQL命令的方法ExecuteNonQuery来执行命令,向数据库写入数据,并返回受影响行数;
int rowAffected = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
⑤图像框(PictureBox)
点击打开图片按钮,如下图:
然后选择一张图片,如下图:
然后点击打开,读取这张图片,如下图:
打开图片按钮代码如下:
private void btn_OpenPhoto_Click(object sender, EventArgs e)
{
OpenFileDialog openPhotoDialog = new OpenFileDialog() //声明并实例化打开文件对话框;
{ //在初始化器中,设置打开文件对话框的各属性;
Title = "打开照片文件" //对话框标题;
,
Filter = "BMP Files (*.bmp)|*.bmp" //文件格式过滤器;
,
InitialDirectory = @"C:\" //初始目录;
};
if (openPhotoDialog.ShowDialog() == DialogResult.OK) //显示打开文件对话框,若打开文件对话框的对话结果为点击OK键;
{
this.PhotoFileName = openPhotoDialog.FileName; //将对话框获得的文件名,存入本窗体的私有字段中;
this.ptb_Photo.Image = Image.FromFile(this.PhotoFileName); //调用图像的静态方法FromFile从指定文件中读取图像,并赋予图像框;
}
}
点击保存按钮,存入数据,代码如下:
private void btn_Yes_Click(object sender, EventArgs e)
{
MemoryStream memoryStream = new MemoryStream(); //声明并实例化内存流,用于读取照片的字节数据;
this.ptb_Photo.Image.Save(memoryStream, ImageFormat.Bmp); //调用图像框的图像的静态方法Save,将图像保存至内存流;
byte[] photoBytes = new byte[memoryStream.Length]; //声明并实例化字节数组,用于保存照片数据;数组长度对应内存流长度;
memoryStream.Seek(0, SeekOrigin.Begin); //保存后的内存流的偏移位置在末尾,需通过查找来将偏移位置设为起始;
memoryStream.Read(photoBytes, 0, photoBytes.Length); //将内存流读入字节数组;
this.Patient.P_Photo = photoBytes;
PatientBll.SignUp(this.Patient); //调用业务逻辑层的静态方法,对用户执行注册操作;
MessageBox.Show(this.Patient.Message); //在消息框中显示注册消息;
}
2.输出数据
①下拉框(ComboBox)
(1)构建存储数据的数据表(DataTable)
DataTable dataTable = new DataTable(); //声明并实例化数据表,用于保存数据,以用作下拉框数据源;
(2)构造数据适配器(SqlDataAdapter)
首先,声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令
其次,将SQL数据适配器的查询命令属性指向SQL命令
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter();
sqlDataAdapter.SelectCommand = sqlCommand;
sqlDataAdapter.Fill(dataTable);//SQL数据适配器读取数据,并填充班级数据表;
(3)设置Combobox数据源及基本配置
DisplayMember:配置Combobox的显示成员
ValueMember:配置Combobox的值成员
this.Combobox1.DataSource = dataTable;//将下拉框Combobox1的数据源设为班级数据表;
this.Combobox1.DisplayMember = "Name";//将下拉框的显示成员设为数据表的名称列;
this.Combobox1.ValueMember = "No"; //将下拉框的值成员设为班级数据表的编号列;
②文本框(TextBox)
(1)构建存储数据的数据表
调用SQL命令的方法ExecuteReader来执行命令,并获取数据阅读器;
(2)读取数据记录
在数据阅读器的索引器中指定列名,从而访问当前记录的指定列的值,并赋予TextBox;
【注意】将读取的数据类型转化为string类型(用.ToString)
具体代码如下:
/// <summary>
/// 公有方法:构造函数;
/// </summary>
public frm_StudentInfo()
{
InitializeComponent();
this.StartPosition = FormStartPosition.CenterScreen; //本窗体启动位置设为屏幕中央;
}
/// <summary>
/// 私有方法:点击载入按钮;
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Load_Click(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(local);Database=EduBase10;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令;
sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand.CommandText = "SELECT * FROM tb_Student WHERE No=@No;"; //指定SQL命令的命令文本;
sqlCommand.Parameters.AddWithValue("@No", "3120707001"); //向SQL命令的参数集合添加参数的名称、值;
sqlConnection.Open(); //打开SQL连接;
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(); //调用SQL命令的方法ExecuteReader来执行命令,并获取数据阅读器;
if (sqlDataReader.Read()) //若数据阅读器成功读取到下一条记录(首次查询则表示第一条记录);
{
this.txb_No.Text = sqlDataReader["No"].ToString(); //在数据阅读器的索引器中指定列名,从而访问当前记录的指定列的值,并赋予相应控件;
this.txb_Name.Text = sqlDataReader["Name"].ToString();
this.txb_Gender.Text = sqlDataReader["Gender"].ToString();
this.txb_BirthDate.Text = ((DateTime)sqlDataReader["BirthDate"]).ToShortDateString(); //生日首先转换为日期时间类型,再调用ToShortDateString方法获取日期部分;
this.txb_Class.Text = sqlDataReader["Class"].ToString();
this.txb_Speciality.Text = sqlDataReader["Speciality"].ToString();
}
sqlDataReader.Close(); //关闭数据阅读器(同时关闭连接);
}
截图如下:
③单选按钮(RadioButton)
【注意】将读取的数据转化为布尔类型
具体代码如下:
/// <summary>
/// 私有方法:点击载入按钮;
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_Load_Click(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection(); //声明并实例化SQL连接;
sqlConnection.ConnectionString =
"Server=(local);Database=EduBase10;Integrated Security=sspi"; //在字符串变量中,描述连接字符串所需的服务器地址、数据库名称、集成安全性(即是否使用Windows验证);
SqlCommand sqlCommand = new SqlCommand(); //声明并实例化SQL命令;
SqlCommand sqlCommand2 = new SqlCommand(); //声明并实例化SQL命令;
sqlCommand.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand2.Connection = sqlConnection; //将SQL命令的连接属性指向SQL连接;
sqlCommand.CommandText = "SELECT * FROM tb_Class;"; //指定SQL命令的命令文本;该命令查询所有班级,以用作下拉框数据源;
sqlCommand2.CommandText = "SELECT * FROM tb_Student WHERE No=@No;"; //指定SQL命令的命令文本;该命令查询指定学生;
sqlCommand2.Parameters.AddWithValue("@No", "3170707010"); //向SQL命令的参数集合添加参数的名称、值;
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;
sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令;
DataTable classTable = new DataTable(); //声明并实例化数据表,用于保存所有班级,以用作下拉框数据源;
sqlConnection.Open(); //打开SQL连接;
sqlDataAdapter.Fill(classTable); //SQL数据适配器读取数据,并填充班级数据表;
this.cmb_Class.DataSource = classTable; //将班级下拉框的数据源设为班级数据表;
this.cmb_Class.DisplayMember = "Name"; //将班级下拉框的显示成员设为班级数据表的名称列;
this.cmb_Class.ValueMember = "No"; //将班级下拉框的值成员设为班级数据表的编号列;
SqlDataReader sqlDataReader = sqlCommand2.ExecuteReader(); //调用SQL命令的方法ExecuteReader来执行命令,并获取数据阅读器;
if (sqlDataReader.Read()) //若数据阅读器成功读取到下一条记录(首次查询则表示第一条记录);
{
this.txb_No.Text = sqlDataReader["No"].ToString(); //在数据阅读器的索引器中指定列名,从而访问当前记录的指定列的值,并赋予相应控件;
this.txb_Name.Text = sqlDataReader["Name"].ToString();
this.rdb_Male.Checked = (bool)sqlDataReader["Gender"];
this.rdb_Female.Checked = !(bool)sqlDataReader["Gender"];
this.dtp_BirthDate.Value = (DateTime)sqlDataReader["BirthDate"];
this.cmb_Class.SelectedValue = (int)sqlDataReader["ClassNo"];
this.txb_Speciality.Text = sqlDataReader["Speciality"].ToString();
}
sqlDataReader.Close(); //关闭数据阅读器(同时关闭连接);
}
截图如下:
④日期控件(DateTimePicker)
代码截图同上(单选按钮)
⑤图像框(PictureBox)
声明字节数组,用于保存照片数据;但先赋予空值
byte[] photoBytes = null;
根据照片是否为数据库空值,分别将空值、转为字节数组的照片数据赋予事先声明的字节数组
photoBytes =(sqlDataReader["Photo"] == DBNull.Value ? null : (byte[])sqlDataReader["Photo"]);
if (photoBytes != null){
MemoryStream memoryStream = new MemoryStream(photoBytes);//声明并实例化内存流,用于读取照片的字节数据;
this.PictureBox1.Image = Image.FromStream(memoryStream);//调用图像的静态方法FromStream从内存流中读取图像,并赋予图像框;
点击更新按钮,将图片存入数据库,显示更新1行的对话框,如下图:
⑥网格视图(DataGridView)
sqlDataAdapter2.Fill(studentTable);
this.DataGridView1.Columns.Clear();//数据网格视图的列集合清空;
this.DataGridView1.DataSource = studentTable;//将数据网格视图的数据源设为学生数据表;
this.DataGridView1.Columns["No"].HeaderText = "学号";//将数据网格视图的指定列的表头文本设为中文;
this.DataGridView1.Columns["Name"].HeaderText = "姓名";
this.DataGridView1.Columns["Gender"].HeaderText = "性别";