C# 如何使用两个组合框筛选datagridview
我有一个datagridview和两个组合框(cboYear和cboSection)。我已经使用第一个组合框成功过滤了datagridview,现在我想知道如何使用第二个组合框过滤过滤后的datagridview(显示特定年份和部门的所有学生)。我已经搜索了一些,但我不明白它是如何工作的 下面是我使用第一个cbo进行过滤的代码C# 如何使用两个组合框筛选datagridview,c#,winforms,C#,Winforms,我有一个datagridview和两个组合框(cboYear和cboSection)。我已经使用第一个组合框成功过滤了datagridview,现在我想知道如何使用第二个组合框过滤过滤后的datagridview(显示特定年份和部门的所有学生)。我已经搜索了一些,但我不明白它是如何工作的 下面是我使用第一个cbo进行过滤的代码 //Filter using combobox private void LoadYearSection() { int i = 0;
//Filter using combobox
private void LoadYearSection()
{
int i = 0;
if (cboYear.Text == "All Students")
{
guna2DataGridView1.Rows.Clear();
cn.Open();
cm = new SqlCommand("SELECT s.studentID, s.studentNo, s.Lname, s.Fname, s.MI, s.gender, s.yearLevel, s.section, s.studImage, g.name, g.contactNo, g.address FROM Student s INNER JOIN Guardian g ON g.studentNo = s.studentNo WHERE g.studentNo = s.studentNo AND s.isActive = 'true'", cn);
dr = cm.ExecuteReader();
while (dr.Read())
{
i += 1;
guna2DataGridView1.Rows.Add(i, dr["studentID"].ToString(), dr["studentNo"].ToString(), dr["Lname"].ToString(), dr["Fname"].ToString(), dr["MI"].ToString(), dr["gender"].ToString(), dr["yearLevel"].ToString(), dr["section"].ToString(), dr["name"].ToString(), dr["contactNo"].ToString(), dr["address"].ToString(), dr["studImage"]);
}
dr.Close();
cn.Close();
}
else
{
guna2DataGridView1.Rows.Clear();
cn.Open();
cm = new SqlCommand("SELECT s.studentID, s.studentNo, s.Lname, s.Fname, s.MI, s.gender, s.yearLevel, s.section, s.studImage, g.name, g.contactNo, g.address FROM Student s INNER JOIN Guardian g ON g.studentNo = s.studentNo WHERE g.studentNo = s.studentNo AND s.isActive = 'true' AND s.yearLevel LIKE @yearLevel", cn);
cm.Parameters.AddWithValue("@yearLevel", cboYear.Text);
dr = cm.ExecuteReader();
while (dr.Read())
{
i += 1;
guna2DataGridView1.Rows.Add(i, dr["studentID"].ToString(), dr["studentNo"].ToString(), dr["Lname"].ToString(), dr["Fname"].ToString(), dr["MI"].ToString(), dr["gender"].ToString(), dr["yearLevel"].ToString(), dr["section"].ToString(), dr["name"].ToString(), dr["contactNo"].ToString(), dr["address"].ToString(), dr["studImage"]);
}
dr.Close();
cn.Close();
}
}
所有这些都需要修改查询以包含该节。我不知道数据,但可能看起来像:
private void LoadYearSection()
{
int i = 0;
string yearClause = string.Empty;
string sectionClause = string.Empty;
if (cboYear.Text != "All Students")
{
yearClause = "AND s.yearLevel = @yearLevel";
}
if (cboSection.Text != "All Students")
{
sectionClause = "AND s.section = @section"
}
guna2DataGridView1.Rows.Clear();
cn.Open();
cm = new SqlCommand($@"SELECT s.studentID, s.studentNo, s.Lname, s.Fname, s.MI, s.gender, s.yearLevel, s.section, s.studImage, g.name, g.contactNo, g.address
FROM Student s
INNER JOIN Guardian g ON g.studentNo = s.studentNo
WHERE g.studentNo = s.studentNo AND s.isActive = 'true' {yearClause} {sectionClause}", cn);
if (cboYear.Text != "All Students")
{
cm.Parameters.AddWithValue("@yearLevel", cboYear.Text);
}
if (cboSection.Text != "All Students")
{
cm.Parameters.AddWithValue("@section", cboSection.Text);
}
dr = cm.ExecuteReader();
while (dr.Read())
{
i += 1;
guna2DataGridView1.Rows.Add(i, dr["studentID"].ToString(), dr["studentNo"].ToString(), dr["Lname"].ToString(), dr["Fname"].ToString(), dr["MI"].ToString(), dr["gender"].ToString(), dr["yearLevel"].ToString(), dr["section"].ToString(), dr["name"].ToString(), dr["contactNo"].ToString(), dr["address"].ToString(), dr["studImage"]);
}
dr.Close();
cn.Close();
}
所有这些都需要修改查询以包含该节。我不知道数据,但可能看起来像:
private void LoadYearSection()
{
int i = 0;
string yearClause = string.Empty;
string sectionClause = string.Empty;
if (cboYear.Text != "All Students")
{
yearClause = "AND s.yearLevel = @yearLevel";
}
if (cboSection.Text != "All Students")
{
sectionClause = "AND s.section = @section"
}
guna2DataGridView1.Rows.Clear();
cn.Open();
cm = new SqlCommand($@"SELECT s.studentID, s.studentNo, s.Lname, s.Fname, s.MI, s.gender, s.yearLevel, s.section, s.studImage, g.name, g.contactNo, g.address
FROM Student s
INNER JOIN Guardian g ON g.studentNo = s.studentNo
WHERE g.studentNo = s.studentNo AND s.isActive = 'true' {yearClause} {sectionClause}", cn);
if (cboYear.Text != "All Students")
{
cm.Parameters.AddWithValue("@yearLevel", cboYear.Text);
}
if (cboSection.Text != "All Students")
{
cm.Parameters.AddWithValue("@section", cboSection.Text);
}
dr = cm.ExecuteReader();
while (dr.Read())
{
i += 1;
guna2DataGridView1.Rows.Add(i, dr["studentID"].ToString(), dr["studentNo"].ToString(), dr["Lname"].ToString(), dr["Fname"].ToString(), dr["MI"].ToString(), dr["gender"].ToString(), dr["yearLevel"].ToString(), dr["section"].ToString(), dr["name"].ToString(), dr["contactNo"].ToString(), dr["address"].ToString(), dr["studImage"]);
}
dr.Close();
cn.Close();
}
只需添加更多参数,这不是火箭科学。但我没有什么提示给你
- 干燥-不要重复你自己。在程序中复制并粘贴一段代码,如果这通常是一件坏事
- 处置一次性物品,使用
使用
- 您不需要在
中的
,您已经在g.studentNo=s.studentNo
中处于打开状态
- 避免AddWithValue,显式定义类型
guna2DataGridView1.Rows.Clear(); try { cn.Open(); using (var cm = new SqlCommand()) { StringBuilder commandText = new StringBuilder( @"SELECT s.studentID, s.studentNo, s.Lname, s.Fname, s.MI, s.gender, s.yearLevel, s.section, s.studImage, g.name, g.contactNo, g.address FROM Student s INNER JOIN Guardian g ON g.studentNo = s.studentNo WHERE 1=1"); if (onlyActive) { commandText.Append(" AND s.isActive = 'true'"); } if (cboYear.Text != "All Students") { commandText.Append(" AND s.yearLevel LIKE @yearLevel"); cm.Parameters.Add("@yearLevel", SqlDbType.NVarChar, 400).Value = cboYear.Text; } // add any number of conditions cm.Connection = cn; cm.CommandText = commandText.ToString(); using (var dr = cm.ExecuteReader()) { int i = 0; while (dr.Read()) { guna2DataGridView1.Rows.Add(++i, dr["studentID"].ToString(), dr["studentNo"].ToString(), dr["Lname"].ToString(), dr["Fname"].ToString(), dr["MI"].ToString(), dr["gender"].ToString(), dr["yearLevel"].ToString(), dr["section"].ToString(), dr["name"].ToString(), dr["contactNo"].ToString(), dr["address"].ToString(), dr["studImage"]); } } } } finally { cn.Close(); }
- 干燥-不要重复你自己。在程序中复制并粘贴一段代码,如果这通常是一件坏事
- 处置一次性物品,使用
使用
- 您不需要在
中的
,您已经在g.studentNo=s.studentNo
中处于打开状态
- 避免AddWithValue,显式定义类型
guna2DataGridView1.Rows.Clear(); try { cn.Open(); using (var cm = new SqlCommand()) { StringBuilder commandText = new StringBuilder( @"SELECT s.studentID, s.studentNo, s.Lname, s.Fname, s.MI, s.gender, s.yearLevel, s.section, s.studImage, g.name, g.contactNo, g.address FROM Student s INNER JOIN Guardian g ON g.studentNo = s.studentNo WHERE 1=1"); if (onlyActive) { commandText.Append(" AND s.isActive = 'true'"); } if (cboYear.Text != "All Students") { commandText.Append(" AND s.yearLevel LIKE @yearLevel"); cm.Parameters.Add("@yearLevel", SqlDbType.NVarChar, 400).Value = cboYear.Text; } // add any number of conditions cm.Connection = cn; cm.CommandText = commandText.ToString(); using (var dr = cm.ExecuteReader()) { int i = 0; while (dr.Read()) { guna2DataGridView1.Rows.Add(++i, dr["studentID"].ToString(), dr["studentNo"].ToString(), dr["Lname"].ToString(), dr["Fname"].ToString(), dr["MI"].ToString(), dr["gender"].ToString(), dr["yearLevel"].ToString(), dr["section"].ToString(), dr["name"].ToString(), dr["contactNo"].ToString(), dr["address"].ToString(), dr["studImage"]); } } } } finally { cn.Close(); }
数据集/数据表中,然后从数据集/数据表中过滤数据,而不是每次用户更改组合框值时都重新查询数据库。此外,您可以/应该将它们作为数据源
使用到网格中,像发布的代码那样从数据表
手动添加行是不必要的,并且为您创建了更多的工作。我认为这可能是“一次”查询所有数据的更好方法并将其放入数据集/数据表
中,然后从数据集/数据表
中过滤数据,而不是在用户每次更改组合框值时重新查询数据库。此外,您可以/应该将它们作为数据源
使用到网格中,不需要像发布的代码那样从数据表
手动添加行,这会为您带来更多的工作。您好,这仍然不起作用。我的datagridviewHello中没有显示任何内容,这仍然不起作用。我的DataGridView中没有显示任何内容非常感谢,但这只是使用第一个组合框筛选数据。Sir您现在应该能够在标记的位置上实现它。非常感谢,但这只是使用第一个组合框筛选数据。Sir您现在应该能够在标记的位置上实现它。