基於

2013-08-07 19 views
0

我的工作,我用一個類型DataSet和數據綁定我的第一個小數據庫應用子行數過濾一個BindingSource的:基於

enter image description here

我有一個customersBindingSource綁定列表的客戶分配給左側的ListBoxallowedclientsBindingSource將允許的客戶(所選客戶的)列表綁定到右側的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骨料。我也嘗試在數據表的DefaultView上設置RowFilter屬性,而不是在綁定源上。但是那也行不通。

是否真的沒有乾淨簡單的解決方案,而無需手動進行?

回答

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); 

在客戶端過濾表啓用=假:

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)); 
+0

謝謝您的回答!我仍然希望得到一個更簡單的解決方案,可以使用數據綁定(請參閱我的編輯)。 –