2009-05-04 27 views
5

estoy usando un BindingSource.Filter para enumerar solo ciertos elementos de la fuente de datos. sobre todo lo uso como esto mucho:.NET BindingSource.Filter con expresiones regulares

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

ahora mi pregunta es, si de alguna manera es posible utilizar expresiones regulares con estos filtros.

En especial me necesita comodín múltiple (*) como caracteres

*hello*world* 

gracias!

+0

Cuál es la fuente de datos subyacente? ¿Una 'DataTable'? Una lista ? etc –

+0

Editando con una alternativa ... –

+0

sí, es un "DataTable" – clamp

Respuesta

10

Puede consultar el DataTable con LINQ con bastante facilidad y luego puede usar un Regex real dentro de la consulta para filtrarlo de todos modos.

Algo como esto ...

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

Esto le dará las filas que coinciden basan en una expresión regular real, no sé lo que hay que hacer con la información, pero esto le permitiría para obtener las filas basadas en un Regex.

actualización **** ** - Tratando de aclarar sobre la base de comentario

No sé lo que usted está usando esto por tanto no tengo un gran marco, pero por lo que se puede adivinar están usando una DataTable para enlazar datos a una Grilla o algo así. Si este es el caso, creo que debería poder asignar "lista" desde el fragmento que incluí aquí como DataSource (suponiendo que esté utilizando un BindingSource) y creo que funcionará. No uso DataTables, generalmente me apego a los objetos para trabajar con mis datos, así que no estoy exactamente seguro de cómo manejará la lista de filas, pero creo que funcionaría (o estaría lo suficientemente cerca como para buscar un poco en Google). Lo haría).

+0

gracias, pero nunca he usado LINQ antes. ¿Cómo puedo usarlo dentro de mi código C# donde tengo BindingSource? – clamp

+0

sí, la tabla de datos se visualiza con DataGridView – clamp

5

BindingSource depende de IBindingListView.Filter para esta funcionalidad. El comportamiento depende completamente en la implementación de la lista específica. ¿Es esto un DataTable/DataView? Si es así, esto se asigna a DataView.RowFilter, con la sintaxis enumerada here.

La aplicación DataView no tiene soporte de expresiones regulares, pero apoya a través de LIKE* - es decir, cuando FilterText es algo así como "Foo*Bar*". Al menos eso es lo que yo entiendo.


Todavía estoy suponiendo que está utilizando DataTable/DataView ... una alternativa pragmática podría ser la introducción de una columna extra (bool) para el propósito. Establece/borra ese marcador como el predicado (usando una expresión regular o cualquier otra lógica complicada), y simplemente usa el filtro de fila para decir "donde está establecido". No muy limpio, tal vez, pero mucho más simple que la implementación de una vista de datos personalizada/binding-source.


Si está utilizando objetos (en lugar de DataTable), a continuación, otra opción podría ser el Dynamic LINQ Library. No conozco el rango completo de lo que admite, pero (Where(string)) ciertamente tiene una gran parte de la capacidad RowFilter. Y dado que el código está disponible en el proyecto de ejemplo, es posible ¿Podría educarlo para aplicar una expresión regular?

+0

gracias, esto casi funciona, no parece entender * en medio de una palabra, pero solo al principio y al final, como este : * test * Realmente lo necesitaría en medio de una palabra. :-) – clamp

+0

gracias, creo que entiendo lo que quieres decir, pero eso requeriría hacer una lista personalizada de todas las cadenas que quiero filtrar y luego aplicar expresiones regex en ella. ¿hay algo para esto en .NET ya, o tendré que hacer mi propia expresión regular? – clamp

+0

Regex está integrado en .NET, pero realmente no seguí el resto del comentario, me temo ... –

1

El comentario más abajo no funciona muy bien:

" ... una alternativa pragmática podría ser la introducción de una columna extra (bool) con el propósito de ajuste/claro que el predicado como marcador (usando una. regex o cualquier otra lógica complicada), y simplemente use el filtro de filas para decir "donde se establece". No muy limpio, tal vez, pero mucho más simple que la implementación de una vista de datos personalizada/binding-source. "

Cuando configura la nueva columna, esto hace que el estado de la fila cambie y básicamente termina con toda la tabla/dataview pensando que debe hacer cada fila en la próxima actualización. No estoy seguro de cómo solucionar este problema.

1

Resolví este problema dividiendo la cadena de búsqueda por el comodín y luego creé la expresión de filtro de fila usando los valores de división.

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() + "')"; 

} 

Si utiliza varios comodines puede crear una función recursiva que crea el filtro de expressio

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 
Cuestiones relacionadas