博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习笔记(六)——数据表的查找功能、数据行、数据列的综合应用
阅读量:5090 次
发布时间:2019-06-13

本文共 7016 字,大约阅读时间需要 23 分钟。

学习笔记(六)——数据表的查找功能、数据行、数据列的综合应用

一、数据表的查找功能

整体界面

实现步骤:

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;                                     //根据当前页号、每页大小,计算相应的行编号范围,并作为行筛选条件;        }

 

转载于:https://www.cnblogs.com/Angular-JS/p/7739662.html

你可能感兴趣的文章