Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用两个组合框筛选datagridview_C#_Winforms - Fatal编程技术网

C# 如何使用两个组合框筛选datagridview

C# 如何使用两个组合框筛选datagridview,c#,winforms,C#,Winforms,我有一个datagridview和两个组合框(cboYear和cboSection)。我已经使用第一个组合框成功过滤了datagridview,现在我想知道如何使用第二个组合框过滤过滤后的datagridview(显示特定年份和部门的所有学生)。我已经搜索了一些,但我不明白它是如何工作的 下面是我使用第一个cbo进行过滤的代码 //Filter using combobox private void LoadYearSection() { int i = 0;

我有一个datagridview和两个组合框(cboYear和cboSection)。我已经使用第一个组合框成功过滤了datagridview,现在我想知道如何使用第二个组合框过滤过滤后的datagridview(显示特定年份和部门的所有学生)。我已经搜索了一些,但我不明白它是如何工作的

下面是我使用第一个cbo进行过滤的代码

//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您现在应该能够在标记的位置上实现它。