0

我正在开发我的第一个小型数据库应用程序,其中使用了类型化DataSet和数据绑定:

在此处输入图像描述

我必须customersBindingSource将客户列表绑定到ListBox左侧,并将allowedclientsBindingSource允许的客户列表(所选客户的)绑定到DataGridView右侧。

现在我想应用一个过滤器,以便仅在右侧显示禁用的客户端。我可以通过设置来做到这一点

allowedclientsBindingSource.Filter = "Enabled = 'false'";

这很好用。现在并非所有客户都有禁用客户。我只想显示左边那些实际上有残疾客户的客户。所以我正在寻找这样的东西:

customersBindingSource.Filter = "numberOfAllowedClients > 0";

当然,这numberOfAllowedClients必须参考已过滤的允许客户端列表。

实现此目的的正确过滤器表达式是什么?

编辑:

如果可能的话,我想继续使用数据绑定而不是ListBox手动填充。

我发现我可以根据子行数过滤客户列表,如下所示:

customersBindingSource.Filter = "Count(Child.AllowedClientID) > 0";

但它使用未过滤的客户端列表。我也试过:

customersBindingSource.Filter = "Count(Child.Enabled = 'false') > 0";

但这不起作用,因为Count聚合中不允许使用任何表达式。我还尝试在数据表而不是绑定源上设置RowFilter属性。DefaultView但这也没有用。

如果不手动进行,真的没有干净简单的解决方案吗?

4

1 回答 1

1

您可以使用 LINQ 创建临时数据表以用作数据源。

建立客户表:

DataTable Customer = new DataTable();
Customer.Columns.Add("CustomerID");
Customer.Columns.Add("Name");

DataRow Stefan = Customer.NewRow();
Stefan["CustomerID"] = 1;
Stefan["Name"] = "Stefan";
Customer.Rows.Add(Stefan);

DataRow Robert = Customer.NewRow();
Robert["CustomerID"] = 2;
Robert["Name"] = "Robert";
Customer.Rows.Add(Robert);

DataRow William = Customer.NewRow();
William["CustomerID"] = 3;
William["Name"] = "William";
Customer.Rows.Add(William);

构建客户表:

DataTable Client = new DataTable();
Client.Columns.Add("ClientID");
Client.Columns.Add("CustomerID");
Client.Columns.Add("Enabled");

DataRow Client1 = Client.NewRow();
Client1["ClientID"] = 1;
Client1["CustomerID"] = 1;
Client1["Enabled"] = true;
Client.Rows.Add(Client1);

DataRow Client2 = Client.NewRow();
Client2["ClientID"] = 2;
Client2["CustomerID"] = 2;
Client2["Enabled"] = true;
Client.Rows.Add(Client2);

DataRow Client3 = Client.NewRow();
Client3["ClientID"] = 3;
Client3["CustomerID"] = 2;
Client3["Enabled"] = false;
Client.Rows.Add(Client3);

DataRow Client4 = Client.NewRow();
Client4["ClientID"] = 4;
Client4["CustomerID"] = 3;
Client4["Enabled"] = false;
Client.Rows.Add(Client4);

过滤客户端表以启用 = false:

BindingSource ClientBS = new BindingSource();
ClientBS.DataSource = Client;
ClientBS.Filter = "Enabled = false";

使用 LINQ 连接这两个表并仅返回带有禁用客户端的客户行:

var CustomersWithDisabledClients = from client in Client.AsEnumerable()
                                   from customer in Customer.AsEnumerable()
                                   where Convert.ToInt32(customer["CustomerID"]) == Convert.ToInt32(client["CustomerID"]) &&
                                   Convert.ToBoolean(client["Enabled"]) == false
                                   select new { CustomerID = customer["CustomerID"], Name = customer["Name"] };

克隆客户表并添加禁用客户的客户行以与您的绑定源一起使用:

DataTable filteredCustomer = Customer.Clone();
CustomersWithDisabledClients.ToList().ForEach(r => filteredCustomer.Rows.Add(r));
于 2013-08-07T17:31:31.490 回答