学习笔记(六)——数据表的查找功能、数据行、数据列的综合应用
一、数据表的查找功能
整体界面
实现步骤:
1、查询整张表格,用作数据网格视图的数据源
1Command.CommandText="SELECT * FROM tb_Course;"; 1DataAdapter sqlDataAdapter= new SqlDataAdapter();
2、填充SqlDataAdapter
1DataAdapter.Fill(this.CourseTable);
3、复制整张数据表,并显示到界面中
this.PreCourseTable=this.CourseTable.Copy();
使用数据表的行集合的方法 Find,据主键值查找相应的编号。并使用数据表的Clone方法创建一张与数据源表格结构相同的空表,用于保存搜索过后的结果。
4、实现按照编号搜索
Find————DataRow————DataTable————DataSource
↑ ↑
据主键查找 使用Clone 方法:创建一张结构一样,内容为空的数据表
(1)查找语句:
DataRow searchResultRow = this.CourseTable.Rows.Find(this.txb_CourseNo.Text.Trim() 只接受主键值 );
(2)导入数据
DataTable searchResultTable = this.CourseTable.Clone();searchResultTable.ImportRow(searchResultRow);
5、据名称查找
(1)要实现据名称查找,首先要将名称排序,以方便查找。即将主键和需要查找的列复制到一张表中,再对需要查找的列进行排序。
this.PreCourseTable=this.CourseTable.Copy();this.CourseViewByName=new DataView();this.CourseViewByName.Table=this.CourseTable;this.CourseViewByName.Sort="Name ASC";
(2)使用数据视图的FindRows方法查找需要的行,使用Clone方法创建结构相同的空表。使用循环语句,遍历搜索结果所在的数据行视图数组。
(3)通过每条数据行视图的属性Row获取相应的数据行,并导入数据表。
private void btn_SearchByName_Click(object sender,EventArgs e){ DataRowView[] searchResultRowViews=this.CourseViewByName.FindRows(this.txb_CourseName.Texr.Trim()); DataTable searchResultTable =this.CourseTable.Clone();foreach (DataRowView dataRowView1 in searchResultRowViews) { searchResultTable.ImportRow(dataRowView1.Row); } this.dgv_Course.DataSourse= searchResultTable;}
6、据拼音缩写搜索
(1)现在后端数据库中添加拼音列,在前端显示的时候讲该列设置为不可见,仅用来搜索。
(2)在使用拼音搜索是需要注意将该代码块放入textChange事件中。为了让搜索结果更加的精确和全面,应使用通配符“%”(应为输入的拼音缩写可以在名称的任意位置)
private void txb_Pinyin_TextChange(object sender, EvenArgs e){ DataRow[] searchResultRows=this.CoueseTable.Select("Pinyin LIKE '%" + this.txb_Pinyin.Text.Trim()+"%'");DataTable searchResultTable = this.CoueseTable.Clone();foreach(DataRow row in searchResultRows) { searchResultTable.ImportRow(row); } this.dgv_Couese.DataSourse = searchResultTable;}
二、数据行的使用——示例:实现选课功能
前端界面
载入数据时
界面左边:用于显示未上的课
界面右边:用于显示已选的课,并且在移动时,已提交到后台数据库的课程不能移除
1、导入外部excel数据的方法:
Excel文件————“.csv”文件(直接用.txt文件打开即可)
↑
转换
(1) 打开excel文件,另存为,选择保存类型“.csv”文件
(2) 导入数据库中
BULK INSERT tb_Course FROM ‘文件URL’ WITH (FIELDTERMINATOR=’,’ //每列的分隔符, ROWTERMINATOR=’\N’ //行的终止符,FIRSTROW=2 //从第几行开始导入);
2、实现已选课程不出现在左边
使用where语句,(WHERE tb_Course.No NOT IN (子查询//查询已选课程的编号))
3、计算现有课程学分
使用Compute方法进行计算
this.lbl_CreditSum.Text = "共" + this.SelectedCourseTable.Compute("SUM(Credit)", "").ToString() + "学分";
4、实现移动选中课程操作
实现基础:
左边 右边
DataTable DataTable
↓ ↓ ↑返回、显示
DataRow 复制 NewDataRow
删除左边的数据(处于删除状态,但实际并未删除数据)
if (this.dgv_Course.RowCount > 0) { DataRow currentCourseRow = ((DataRowView)this.dgv_Course.CurrentRow.DataBoundItem).Row , selectedCourseRow = this.SelectedCourseTable.NewRow(); selectedCourseRow["No"] = currentCourseRow["No"]; selectedCourseRow["Name"] = currentCourseRow["Name"]; selectedCourseRow["Credit"] = currentCourseRow["Credit"]; this.SelectedCourseTable.Rows.Add(selectedCourseRow); currentCourseRow.Delete();
5、实现推选课程(将右边新增行左移)
(1)基本思路:使用remove操作,将右边新增的行移走。左边的数据表执行在数据库中查找右边一处的课程的编号(注意:查找的是处于被删除状态的行,因为之前做的deleted操作,将左边的数据“删除”了,所以无法在数据中查找到,即:查找处于DataViewRowState.Deleted的编号),然后执行deletedCourseRow.RejectChanges()操作,即执行拒绝删除操作,也就是撤销操作。
if (this.dgv_SelectedCourse.RowCount > 0) { DataRow selectedCourseRow = ((DataRowView)this.dgv_SelectedCourse.CurrentRow.DataBoundItem).Row; if (selectedCourseRow.RowState == DataRowState.Unchanged) { return; } else { string courseNo = selectedCourseRow["No"].ToString(); DataRow deletedCourseRow = this.CourseTable.Select("No='" + courseNo + "'", "", DataViewRowState.Deleted)[0]; this.SelectedCourseTable.Rows.Remove(selectedCourseRow); deletedCourseRow.RejectChanges(); this.SelectedCourseTable.Rows.Remove(selectedCourseRow); //移除右边选中的行
三、数据列的操作——实现分页功能
1、要实现分页功能,首先要对数据行有一个编号,设置好每页显示的数据行数(如一页显示十行数据)。所以在前段界面需要新建一张结构与需导入数据一样的空表
sqlCommand.CommandText = "SELECT S.No,S.Name AS SName,C.Name AS CName,SS.TotalScore" + " FROM tb_Student AS S " + " JOIN tb_StudentScore AS SS ON S.No=SS.StudentNo" + " JOIN tb_Course AS C ON SS.CourseNo=C.No" + " WHERE 1=0;";rowIdColumn.DataType = typeof(int); rowIdColumn.AutoIncrement = true;rowIdColumn.AutoIncrementSeed = 1;rowIdColumn.AutoIncrementStep = 1;sqlDataAdapter.Fill(this.CourseTable); //where语句用于指定查找结果为空,此时查询结果只有表头的结构,将查询结果的列名填充进去,就得到一张与源数据结构相同的空表
2、翻页功能——使用行筛选过滤器RowFilter
上一页:
private void btn_PreviosPage_Click(object sender, EventArgs e) { if (this.CurrentPageNo > 1) //若当前页号大于1; { this.CurrentPageNo--; //则当前页号递减; } this.CurrentPageView.RowFilter = //设置课程数据视图的行筛选条件,即筛选当前页的记录; "RowID >" + (this.CurrentPageNo - 1) * this.PageSize + " AND RowID <=" + this.CurrentPageNo * this.PageSize; //根据当前页号、每页大小,计算相应的行编号范围,并作为行筛选条件; }
下一页
private void btn_NextPage_Click(object sender, EventArgs e) { if (this.CurrentPageNo < this.MaxPageNo) //若当前页号尚未超出最大页号; { this.CurrentPageNo++; //则当前页号递增; } this.CurrentPageView.RowFilter = //设置课程数据视图的行筛选条件,即筛选当前页的记录; "RowID >" + (this.CurrentPageNo - 1) * this.PageSize + " AND RowID <=" + this.CurrentPageNo * this.PageSize; //根据当前页号、每页大小,计算相应的行编号范围,并作为行筛选条件; }