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

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

一、数据表的查找功能

整体界面

实现步骤:

1、查询整张表格,用作数据网格视图的数据源

<p>1Command.CommandText="SELECT * FROM  tb_Course;";
       1DataAdapter  sqlDataAdapter= new SqlDataAdapter();
 </p>

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

 

posted @ 2017-10-26 21:49  Angular_JS  阅读(628)  评论(0编辑  收藏  举报