一、知识点描述以及相应代码(相关知识要点在代码段注释中体现)
DataGridView控件(数据网格视图)
使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据。将数据绑定到 DataGridView 控件非常简单和直观,在大多数情况下,只需设置 DataSource 属性即可。在绑定到包含多个列表或表的数据源时,只需将 DataMember 属性设置为指定要绑定的列表或表的字符串即可。利用DataGridView控件我们可以方便地在前端界面操作数据表。
1.DataGridView控件外观设置
this.dgv_Drug.AllowUserToAddRows = false; //数据网格视图不允许用户添加行;
this.dgv_Drug.RowHeadersVisible = false; //数据网格视图的行标题不可见;
this.dgv_Drug.BackgroundColor = Color.White; //数据网格视图的背景色设为白色;
this.dgv_Drug.AutoSizeColumnsMode =
DataGridViewAutoSizeColumnsMode.AllCells; //数据网格视图的自动调整列宽模式设为显示所有单元格;
2.DataGridView控件连接数据库以及修改表格显示状态
SqlConnection sqlConnection = new SqlConnection();
sqlConnection.ConnectionString =
ConfigurationManager.ConnectionStrings["Sql"].ConnectionString;
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText = "SELECT * FROM tb_Drug;";
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器;
sqlDataAdapter.SelectCommand = sqlCommand; //将SQL数据适配器的查询命令属性指向SQL命令;
sqlDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; //设置SQL数据适配器在缺少架构时的动作为追加主键,从而获取数据库中定义的主键;
this.DrugTable = new DataTable(); //实例化本窗体的药品数据表,用于保存所有课程,以用作数据网格视图数据源;
sqlConnection.Open(); //打开SQL连接;
sqlDataAdapter.Fill(this.DrugTable); //SQL数据适配器读取数据,并填充药品表;
sqlConnection.Close();
this.DrugViewByName = new DataView(); //实例化本窗体的药品数据视图,用于按照名称进行快速查询;
this.DrugViewByName.Table = this.DrugTable; //设置药品数据视图对应的数据表;
this.DrugViewByName.Sort = "Name ASC"; //设置药品数据视图的排序条件,即查询所覆盖的列;
this.dgv_Drug.Columns.Clear(); //数据网格视图的列集合清空;
this.dgv_Drug.DataSource = this.DrugTable; //将数据网格视图的数据源设为药品数据表;
this.dgv_Drug.Columns["No"].Visible =false ; //将数据网格视图的指定列的表头文本设为中文;
this.dgv_Drug.Columns["Code"].Visible = false;
this.dgv_Drug.Columns["Name"].HeaderText = "名称";
this.dgv_Drug.Columns["CommonName"].HeaderText = "俗名";
this.dgv_Drug.Columns["TypeNo"].Visible = false;
this.dgv_Drug.Columns["ApprovalNo"].Visible = false;
this.dgv_Drug.Columns["IsEthicals"].HeaderText = "是否处方药(选中为处方药)";
this.dgv_Drug.Columns["Produce"].Visible = false;
this.dgv_Drug.Columns["Validity"].Visible = false;
this.dgv_Drug.Columns["Purchasing"].HeaderText = "进价";
this.dgv_Drug.Columns["RetailPrice"].HeaderText = "零售价";
this.dgv_Drug.Columns["SupplierNo"].Visible = false;
this.dgv_Drug.Columns["Situation"].HeaderText = "库存量";
this.dgv_Drug.Columns["SupplierNo"].Visible = false;
this.dgv_Drug.Columns["Indate"].Visible = false;
this.dgv_Drug.Columns[this.dgv_Drug.Columns.Count - 1].AutoSizeMode =
DataGridViewAutoSizeColumnMode.Fill; //数据网格视图的最后一列的自动调整列宽模式设为填充(至数据网格视图右侧边缘);
3.DataGridView控件中显示下拉框
SqlCommand sqlCommand1 = new SqlCommand();
sqlCommand1.CommandText = "SELECT * FROM tb_Supplier;";
sqlCommand1.Connection = sqlConnection;
SqlDataAdapter sqlDataAdapter1 = new SqlDataAdapter();
sqlDataAdapter1.SelectCommand = sqlCommand1;
sqlDataAdapter1.MissingSchemaAction = MissingSchemaAction.AddWithKey;
this.SupplierTable = new DataTable();
sqlConnection.Open();
sqlDataAdapter1.Fill(SupplierTable);
sqlConnection.Close();
DataGridViewComboBoxColumn cmb_supplier = new DataGridViewComboBoxColumn(); //声明并实例化数据网格视图下拉框列,用于设置供应商
cmb_supplier.HeaderText = "供应商";//设置下拉框列的表头文本;
cmb_supplier.Name = "Supplier";//设置下拉框列的名称;
cmb_supplier.DataSource = SupplierTable; //将供应商下拉框的数据源设为供应商数据表;
cmb_supplier.DisplayMember = "Name"; //将供应商下拉框的显示成员设为供应商数据表的名称列;
cmb_supplier.ValueMember = "No";//设置下拉框列的值成员为(供应商数据表的)编号(列);
cmb_supplier.DisplayIndex = 11;//设置下拉框列的显示顺序;
cmb_supplier.DataPropertyName = "SupplierNo";//设置下拉框列的数据属性名称为(药品数据表的)供应商编号(列);
this.dgv_Drug.Columns.Add(cmb_supplier); //将下拉框列加入数据网格视图的列集合;
4.利用DataGridView控件在前端界面实现更新数据表
private void btn_Update_Click(object sender, EventArgs e)
{
SqlConnection sqlConnection = new SqlConnection();
sqlConnection.ConnectionString =
ConfigurationManager.ConnectionStrings["Sql"].ConnectionString;
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
sqlCommand.CommandText = //指定SQL命令的命令文本;
"UPDATE tb_Drug"
+ " SET Name=@Name,CommonName=@CommonName,IsEthicals=@IsEthicals,SupplierNo=@SupplierNo,Purchasing=@Purchasing,RetailPrice=@RetailPrice,Situation=@Situation"
+ " WHERE No=@No;";
sqlCommand.Parameters.Add("@Name", SqlDbType.VarChar, 0, "Name"); //向SQL命令的参数集合添加参数的名称、SQL Server数据类型、长度(仅用于定长类型)、所绑定的数据表中的列名;
sqlCommand.Parameters.Add("@CommonName", SqlDbType.VarChar, 0, "CommonName");
sqlCommand.Parameters.Add("@IsEthicals", SqlDbType.Bit, 0, "IsEthicals");
sqlCommand.Parameters.Add("@SupplierNo", SqlDbType.Int, 0, "SupplierNo");
sqlCommand.Parameters.Add("@Purchasing", SqlDbType.VarChar, 0, "Purchasing");
sqlCommand.Parameters.Add("@RetailPrice", SqlDbType.VarChar, 0, "RetailPrice");
sqlCommand.Parameters.Add("@Situation", SqlDbType.VarChar, 0, "Situation");
sqlCommand.Parameters.Add("@No", SqlDbType.Char, 7, "No");
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(); //声明并实例化SQL数据适配器,同时借助构造函数,将其SelectCommand属性设为先前创建的SQL命令;
sqlDataAdapter.UpdateCommand = sqlCommand; //将SQL数据适配器的更新命令属性指向SQL命令;
DataTable studentTable = (DataTable)this.dgv_Drug.DataSource; //声明数据表,并指向数据网格视图的数据源;数据源默认类型为object,还需强制转换类型;
sqlConnection.Open(); //打开SQL连接;
int rowAffected = sqlDataAdapter.Update(studentTable); //SQL数据适配器根据学生数据表提交更新,并返回受影响行数;
sqlConnection.Close(); //关闭SQL连接;
MessageBox.Show("更新" + rowAffected.ToString() + "行。"); //在消息框显示受影响行数;
}
5.在DataGridView控件显示查询结果
private void btn_SearchByName_Click(object sender, EventArgs e)
{
DataRow[] searchResultRows =
this.DrugTable.Select("Name LIKE '%" + this.txb_DrugName.Text.Trim() + "%'"); //借助本窗体的药品数据表的方法Select,并提供与SQL类似的谓词表达式作为查询条件,根据名称中的个别字进行模糊查询(仅支持%通配符);查询将返回数据行数组;
DataTable searchResultTable = this.DrugTable.Clone(); //借助本窗体的药品数据表的方法Clone,创建相同架构的空表,用于保存搜索结果所在数据行;
foreach (DataRow row in searchResultRows) //遍历搜索结果所在数据行数组;
{
searchResultTable.ImportRow(row); //数据行导入数据表;
}
this.dgv_Drug.DataSource = searchResultTable; //将数据网格视图的数据源设为搜索结果数据表;
}
二、运行结果示例
点击载入前:
点击载入后:
在检索框输入“牛黄“,点击根据名称检索,可以实现模糊检索:
点击更新前:
我们对“牛黄解毒片”的零售价、是否为处方药以及供应商直接在数据表中进行更改,然后点击更新:
三、思维导图