2009-05-04 10 views
5

tôi đang sử dụng BindingSource.Filter để chỉ liệt kê các phần tử nhất định của nguồn dữ liệu. đặc biệt là tôi sử dụng nó như thế này rất nhiều:.NET BindingSource.Filter với cụm từ thông dụng

m_bindingSourceTAnimation.Filter = "Name LIKE '" + FilterText + "'"; 

bây giờ câu hỏi của tôi là, nếu nó là bằng cách nào đó có thể sử dụng biểu thức thông thường với các bộ lọc này.

tôi sẽ đặc biệt cần nhiều ký tự đại diện (*) nhân vật như

*hello*world* 

cảm ơn!

+0

nguồn dữ liệu cơ bản là gì? Một 'DataTable'? Danh sách ? vv –

+0

Chỉnh sửa bằng một cách khác ... –

+0

vâng, nó là một "DataTable" – clamp

Trả lời

10

Bạn có thể truy vấn DataTable với LINQ khá dễ dàng và sau đó bạn có thể sử dụng Regex thực tế trong truy vấn để lọc nó theo ý bạn muốn.

Something như thế này ...

var source = myDataTable.AsEnumerable(); 

var results = from matchingItem in source 
       where Regex.IsMatch(matchingItem.Field<string>("Name"), "<put Regex here>") 
       select matchingItem; 

//If you need them as a list when you are done (to bind to or something) 
var list = results.ToList(); 

Điều này sẽ giúp bạn có được các hàng phù hợp dựa trên một Regex thực tế, tôi không biết những gì bạn cần phải làm gì với những thông tin, nhưng điều này sẽ cho phép bạn để có được các hàng dựa trên Regex.

**** Update ** - Cố gắng làm rõ dựa trên nhận xét

Tôi không biết những gì bạn đang sử dụng này cho nên tôi không có một bối cảnh tuyệt vời, nhưng từ những gì tôi có thể đoán bạn đang sử dụng một DataTable để dữ liệu liên kết với một Grid hoặc một cái gì đó như thế. Nếu đây là trường hợp, tôi nghĩ rằng bạn sẽ có thể chỉ định "danh sách" từ đoạn trích mà tôi đặt ở đây làm DataSource (giả sử bạn đang sử dụng BindingSource) và tôi nghĩ rằng nó sẽ hoạt động. Tôi không sử dụng DataTables, tôi thường dính vào các đối tượng để làm việc với dữ liệu của mình vì vậy tôi không chắc chắn nó sẽ xử lý danh sách các hàng như thế nào, nhưng tôi nghĩ nó sẽ hoạt động (hoặc đủ gần để tìm kiếm một chút sẽ làm điều đó).

+0

cảm ơn, nhưng tôi chưa bao giờ sử dụng LINQ trước đây. làm thế nào tôi có thể sử dụng nó bên trong mã C# của tôi, nơi tôi có BindingSource? – clamp

+0

có, dữ liệu có thể được hiển thị bằng cách sử dụng DataGridView – clamp

5

BindingSource dựa trên IBindingListView.Filter cho chức năng này. Hành vi phụ thuộc vào hoàn toàn về triển khai danh sách cụ thể. Đây có phải là DataTable/DataView không? Nếu có, bản đồ này là DataView.RowFilter, với cú pháp được liệt kê here.

Việc thực hiện DataView không có người hỗ trợ regex, nhưng hỗ trợ LIKE qua * - ví dụ: nơi FilterText là một cái gì đó giống như "Foo*Bar*". Ít nhất thì đó là sự hiểu biết của tôi.


tôi vẫn giả định rằng bạn đang sử dụng DataTable/DataView ... một lựa chọn thực tế có thể là để giới thiệu thêm một cột (bool) cho mục đích này. Đặt/xóa đánh dấu đó làm vị từ (sử dụng regex hoặc bất kỳ logic phức tạp nào khác) và chỉ sử dụng bộ lọc hàng để nói "nơi đặt". Không phải rất sạch sẽ, có thể, nhưng đơn giản hơn rất nhiều so với triển khai một chế độ xem dữ liệu/ràng buộc tùy chỉnh.


Nếu bạn đang sử dụng các đối tượng (chứ không phải là DataTable), sau đó lựa chọn khác có thể là Dynamic LINQ Library. Tôi không biết đầy đủ những gì nó hỗ trợ, nhưng nó (Where(string)) chắc chắn có một số/nhiều khả năng RowFilter. Và vì mã có sẵn trong dự án mẫu, nó là có thể bạn có thể giáo dục nó để áp dụng một regex?

+0

cảm ơn, điều này gần như hoạt động, nó chỉ có vẻ không hiểu * ở giữa một từ nhưng chỉ ở đầu và cuối, như thế này : * kiểm tra * tôi thực sự cần nó ở giữa một từ. :-) – clamp

+0

cảm ơn, tôi nghĩ rằng tôi hiểu những gì bạn có nghĩa là, nhưng điều đó sẽ yêu cầu để làm cho một số danh sách tùy chỉnh của tất cả các chuỗi tôi muốn lọc và sau đó áp dụng regex vào nó. có một cái gì đó cho điều này trong. NET đã có, hoặc tôi sẽ cần phải làm regex của riêng tôi? – clamp

+0

Regex được tích hợp vào .NET, nhưng tôi không thực sự theo dõi phần còn lại của bình luận mà tôi sợ ... –

1

Các bình luận dưới đây không thực sự làm việc:

" ... một lựa chọn thực tế có thể là để giới thiệu thêm một cột (bool) cho mục đích này Set/rõ ràng là dấu hiệu như vị (sử dụng a. regex hoặc bất kỳ logic phức tạp nào khác) và chỉ sử dụng bộ lọc hàng để nói "nơi đặt". Không phải rất sạch sẽ, có thể, nhưng đơn giản hơn nhiều so với triển khai chế độ xem dữ liệu/ràng buộc tùy chỉnh ".

Khi bạn đặt cột mới, điều này làm cho trạng thái hàng thay đổi và về cơ bản bạn kết thúc với toàn bộ bảng/dataview nghĩ rằng nó cần thực hiện mọi hàng trong bản cập nhật tiếp theo. Không chắc chắn cách giải quyết vấn đề này.

1

Tôi đã giải quyết vấn đề này bằng cách chia chuỗi tìm kiếm theo ký tự đại diện và sau đó tạo biểu thức lọc hàng bằng cách sử dụng giá trị phân tách.

Array a = SearchString.Split('*'); 
string rowFilter = ""; 

if (a.GetUpperBound(0) == 1) 
{ 

    rowFilter = "(MODEL_NBR like '" + a.GetValue(0).ToString() + "*' AND MODEL_NBR like '*"  + a.GetValue(1).ToString() + "')"; 

} 

Nếu bạn sử dụng nhiều ký tự đại diện, bạn có thể tạo một hàm đệ quy mà tạo ra expressio lọc

0
'[Description] Is column name 
    Dim SearchStrArr() As String = Split(txtSearch.Text, " ") 
    Dim FilterString As String = "" 
    FilterString = String.Join("%' AND [Description] Like '%", SearchStrArr) 
    FilterString = "[Description] Like '%" & FilterString & "%'" 

    m_bindingSourceTAnimation.Filter = FilterString