如何使用多个组合框过滤datagridview?

罗科沃

新成员
已加入
2018年12月9日
留言内容
1
编程经验
Beginner
大家好!

我对编码非常陌生,正在尝试通过小项目学习C#。我花了一个星期或更长的时间来寻找解决方案,但是尽管线程很多,但对我来说却没有任何意义,因此无法正常工作。
我有一个带有datagridview的表单,我想创建另外5个组合框以对其进行过滤。全部具有相同的数据源。
假设,如果用户选择具有特定条件的组合框"Role",它将显示担任此角色的员工的所有记录,但是如果用户另外选择另一个组合框,例如"Shift",它将进一步缩小范围"Role" on that "Shift"
到目前为止,我设法使datagridview与一个组合框一起使用,但不知道如何添加更多组合框。
您能否根据我的代码给我一个示例,说明如何添加更多组合框?
非常感谢您的帮助。
下面是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace TM_Hub
{
    public partial class frmEmpList : Form
   {
       public frmEmpList()
      {
          InitializeComponent();
      }

    private void frmEmpList_Load(object sender, EventArgs e)
   {
       this.PopulateComboBox();
       this.PopulateDataGridView();
   }
   private void PopulateComboBox()
  {
      string query = "SELECT DISTINCT LastName FROM Employees";
      string constr = @"Data Source=DESKTOP-Q2B3UUH\SQLEXPRESS;Initial Catalog=PeopleManager;Integrated Security=True";
      using (SqlConnection con = new SqlConnection(constr))
     {
         using (SqlDataAdapter sda = new SqlDataAdapter(query, con))
         {
          //Fill the DataTable with records from Table.
          DataTable dt = new DataTable();
          sda.Fill(dt);

          //Insert the Default Item to DataTable.
          DataRow row = dt.NewRow();
          row[0] = "";
          dt.Rows.InsertAt(row, 0);

          //Assign DataTable as DataSource.
          cbLastName.DataSource = dt;
          cbLastName.DisplayMember = "LastName";
          cbLastName.ValueMember = "LastName";
          }
     }
 }
     private void PopulateDataGridView()
    {
         string query = "SELECT EmpID, FirstName, LastName, 角色, Grade, Dept, 转移 FROM Employees";
         query += " WHERE LastName = @LastName";
         query += " OR ISNULL(@LastName, '') = ''";
         string constr = @"Data Source=DESKTOP-Q2B3UUH\SQLEXPRESS;Initial Catalog=PeopleManager;Integrated Security=True";
         using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand(query, con))
           {
               cmd.Parameters.AddWithValue("@LastName", cbLastName.SelectedValue);
               using (SqlDataAdapter sda = new SqlDataAdapter(cmd))
              {
                  DataTable dt = new DataTable();
                  sda.Fill(dt);
                  dgEmpList.DataSource = dt;
               }
            }
         }
      }

      private void cbLastName_SelectionChangeCommitted(object sender, EventArgs e)
     {
         this.PopulateDataGridView();
     }
   }
}


提前致谢!



 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,486
地点
悉尼,澳大利亚
编程经验
10+
将BindingSource添加到您的窗体,然后将DataTable绑定到BindingSource,将BindingSource绑定到网格,而不是直接将DataTable绑定到DataGridView。然后,可以通过设置BingingSource的Filter属性来过滤数据。您可以编写一个方法来执行此操作,然后从每个ComboBox的SelectedIndexChanged或SelectionChangeCommitted事件处理程序中调用该方法。这样的方法可能看起来像这样:
var comboBoxes = new [] {cbLastName, …]; // Put all your ComboBoexes here.

// This will get a string like "LastName = 'Smith'" for each ComboBox with a selection.
var criteria = comboBoxes.Where(cb=> cb.Text != string.Empty)
                         .Select(cb => $"{cb.DisplayMember} = '{cb.Text}'")
                         .ToArray();

// Combine the criteria if there are any, otherwise clear the  过滤 .
BindingSource1.Filter = criteria.Any()
                                       ? string.Join(" AND ", crtieria)
                                       : string.Empty;

请注意,正如我在注释中所指定的那样,该代码将在每种情况下在值周围加上单引号。如果这些值中的任何一个都不是字符串,那么您就必须对此加以考虑,即,不要为数字添加单引号,也不要为日期添加“#”符号和适当的格式。
 
最佳 底部