一、 直接在已有数据中筛选;不必重新检索数据
(1)查询两张表的数据
/// <summary>
/// 加载所有的数据
/// </summary>
private void FillDataStudent()
{
//sql语句
sql = new StringBuilder();
//如果是2张表的数据,某一个字段不能写具体的表名.字段名;直接写字段名
sql.AppendLine("SELECT StudentNo,StudentName,Sex,GradeName,Phone FROM dbo.Student ,dbo.Grade WHERE dbo.Grade.GradeId = dbo.Student.GradeId");
//适配器对象
da = new SqlDataAdapter(sql.ToString(), DBHelper.conn);
//填充数据
da.Fill(ds);
//绑定数据到控件
dgvStudent.DataSource = ds.Tables[0];
}
(2)在原来的基础上根据条件查询年级名称的学生 或是根据年级名称与性别查询
/// <summary>
/// 树的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvStudent_AfterSelect(object sender, TreeViewEventArgs e)
{
//创建数据视图对象
DataView dv = new DataView(ds.Tables[0]);
//声明字符串变量
string rowFilter=string.Empty;
//获得当前节点的层次
int index = tvStudent.SelectedNode.Level;
//(1)使用 RowFilter 属性
//筛选的条件 类似查询语句中 WHERE 后面部分
if (index == 1) //GradeName='S1'
{
rowFilter = string.Format("GradeName='{0}'",tvStudent.SelectedNode.Text);
}
else if (index == 2) //GradeName='S1' AND Sex='女'
{
rowFilter = string.Format("GradeName='{0}' and sex='{1}'", tvStudent.SelectedNode.Parent.Text, tvStudent.SelectedNode.Text);
}
//过滤
dv.RowFilter = rowFilter;
//重新绑定数据 ;
dgvStudent.DataSource = dv;
}
(3)在原来的基础上根据条件查询学生名称的学生
的
/// <summary>
/// 文本按下回车键事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtName_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode==Keys.Enter)
{
//1创建数据视图对象
// DataView dv = new DataView(ds.Tables[0]);
// 为减少实例化DataView对象的步骤,也可使用DataTable的DefaultView属性得到DataView
DataView dv = ds.Tables[0].DefaultView;
//2条件筛选
dv.RowFilter = string.Format("StudentName like '%{0}%'",this.txtName.Text.Trim());
//使用 Sort 属性排序的条件 类似查询语句中 ORDER BY 后面部分
dv.Sort = "studentno desc";
//3重新绑定数据 ;
dgvStudent.DataSource = dv;
}
}