Puedo cargar una lista de los objetos en un datagrid con esto:

dataGrid1.Items.Add(model);

La model se convierten en los datos de una base de datos. Tiene un Id(int), Name(string) y Text(string)

En mi datagrid puedo mostrar sólo el Nombre de la model. ¿Cómo puedo filtrar el datagrid ahora, cuando yo escriba algo en un cuadro de texto?

Yo estaba en esta página: http://msdn.microsoft.com/en-us/library/vstudio/ff407126(v=vs 100).aspx pero no entiendo el código de allí y no puedo explicar cómo me deben transponer que para mi problema.

Dígale a su problema exacto. ¿Qué es el código que usted creó? Nos puede decir qué hay de malo con eso.
No entiendo, cómo utilizar el CollectionViewSource para mi problema. Puede usted explicar cómo me puedo cargar los datos con la `colección..` en mi datagrid y cómo filtrar. @Kylerrr

OriginalEl autor Karl_Schuhmann | 2013-03-22

5 Comentarios

  1. 32

    hay varias manera de filtrar la Colección de

    vamos lo que sugiere que esta es su Clase de Elemento de

    public class Model
    {
        public string Name
        {
            get;
            set;
        }
    }

    y su colección parece

           var ObColl = new ObservableCollection<Model>();
    
            ObColl.Add(new Model() { Name = "John" });
            ObColl.Add(new Model() { Name = "Karl" });
            ObColl.Add(new Model() { Name = "Max" });
            ObColl.Add(new Model() { Name = "Mary" });

    Forma 1 (Predicado):

        public MainWindow()
        {
            InitializeComponent();
    
            //Collection which will take your ObservableCollection
            var _itemSourceList = new CollectionViewSource() { Source = ObColl };
    
            //ICollectionView the View/UI part 
            ICollectionView Itemlist = _itemSourceList.View;
    
            //your Filter
            var yourCostumFilter= new Predicate<object>(item => ((Model)item).Name.Contains("Max"));
    
            //now we add our Filter
            Itemlist.Filter = yourCostumFilter;
    
            dataGrid1.ItemsSource = Itemlist;
        }

    Forma 2 (FilterEventHandler):

        public MainWindow()
        {
            InitializeComponent();
    
            //Collection which will take your Filter
            var _itemSourceList = new CollectionViewSource() { Source = ObColl };
    
           //now we add our Filter
           _itemSourceList.Filter += new FilterEventHandler(yourFilter);
    
            //ICollectionView the View/UI part 
            ICollectionView Itemlist = _itemSourceList.View;
    
            dataGrid1.ItemsSource = Itemlist;
        }
    
        private void yourFilter(object sender, FilterEventArgs e)
        {
            var obj = e.Item as Model;
            if (obj != null)
            {
                if (obj.Name.Contains("Max"))
                    e.Accepted = true;
                else
                    e.Accepted = false;
            }
        }

    Información extendida para Modo 1

    si necesitan varias condiciones o algún complejo de Filtro puede agregar un método a su Predicat

        //your Filter
        var yourComplexFilter= new Predicate<object>(ComplexFilter);
    
        private bool ComplexFilter(object obj)
        {
            //your logic
        }
    Hola, tengo un problema similar.. podría usted por favor, mira este post y dime si es la manera correcta de hacer? sería realmente útil. Gracias 🙂 –stackoverflow.com/questions/15569445/…
    Me gustaría ver alguna sugerencia sobre qué enfoque es el más apropiado en función de la situación actual. Cuidado de añadir que, a su respuesta? Hay un lugar fresco +1 a la espera para que usted si lo haces… 🙂
    mhh yo diría que depende de tus gustos. Si te gusta trabajar con los Acontecimientos que nos FilterEventHandler si usted es más el Objeto amante de utilizar el Predicate solución. También tengo que admitir que no sabemos nada acerca de las diferencias de Rendimiento

    OriginalEl autor WiiMaxx

  2. 5

    Esta es una simple aplicación del uso de la propiedad Filter de ICollectionView. Supongamos que su XAML contiene esto:

    <TextBox x:Name="SearchTextBox" />
    <Button x:Name="SearchButton"
            Content="Search"
            Click="SearchButton_OnClick"
            Grid.Row="1" />
    <DataGrid x:Name="MyDataGrid"
              Grid.Row="2">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Lorem ipsum column"
                                Binding="{Binding}" />
        </DataGrid.Columns>
    </DataGrid>

    A continuación, en el constructor puede obtener la vista predeterminada para los datos, donde puede configurar el filtro de predicado que se ejecutará para cada elemento de tu colección. El CollectionView no sabe cuando debe actualizar la colección, así que tienes que llamar a Actualizar cuando el usuario hace clic en el botón de búsqueda.

    private ICollectionView defaultView;
    
    public MainWindow()
    {
        InitializeComponent();
    
        string[] items = new string[]
        {
            "Asdf",
            "qwer",
            "sdfg",
            "wert",
        };
    
        this.defaultView = CollectionViewSource.GetDefaultView(items);
        this.defaultView.Filter =
            w => ((string)w).Contains(SearchTextBox.Text);
    
        MyDataGrid.ItemsSource = this.defaultView;
    }
    
    private void SearchButton_OnClick(object sender, RoutedEventArgs e)
    {
        this.defaultView.Refresh();
    }

    En esta dirección puede encontrar una descripción más detallada de CollectionViews:
    http://wpftutorial.net/DataViews.html

    OriginalEl autor Loránd Biró

  3. 3

    @WiiMaxx, no se puede comentar como no es suficiente rep. Me gustaría ser un poco más cuidadoso acerca de la directa arroja allí. Pueden ser lento para una cosa y para la otra, si el mismo filtro se aplica a una cuadrícula de la celebración de los diferentes complejos de tipo de datos que habría una InvalidCastException.

    //your Filter
        var yourCostumFilter= new Predicate<object>(item =>
        {
            item = item as Model;
            return item == null || item.Name.Contains("Max");
        });

    Esto no va a romper datagrid y no filtrar los resultados si la conversión falla. Menos impacto para los usuarios si usted recibe el código incorrecto. En la parte superior de que el filtro será más rápido debido a que el «como» operador no hacer explícito el tipo de la coacción directa de fundición de operación.

    He probado el código de los que no puedo compilarlo. lo que usted necesita hacer var model = item as Model; y nos la model en su lógica, entonces va a funcionar bien

    OriginalEl autor steve

  4. 0

    tomar en mirar el Enlace de datos –> en el caso de no agregar elementos a su grilla, pero se establece el itemssource

    <Datagrid ItemsSource="{Binding MyCollectionOfModels}" />

    o

    dataGrid1.ItemsSource = this._myCollectionOfModels;

    y si desea algún tipo de filtrar,ordenar, agrupar mirar CollectionView

    OriginalEl autor blindmeis

  5. 0

    Puede utilizar dataview filtro para filtrar el datagrid filas.

                DataView dv = datatable.DefaultView;
    
                StringBuilder sb = new StringBuilder();
                foreach (DataColumn column in dv.Table.Columns)
                {
                    sb.AppendFormat("[{0}] Like '%{1}%' OR ", column.ColumnName, "FilterString");
                }
                sb.Remove(sb.Length - 3, 3);
                dv.RowFilter = sb.ToString();
                dgvReports.ItemsSource = dv;
                dgvReports.Items.Refresh();

    Donde el «objeto datatable» es de origen de datos, dado para el datagrid y el uso de generador de cadenas de construir el filtro de consulta donde la «Cadena de Filtro» es el texto que desea buscar en el datagrid y configurarlo para que dataview y, finalmente, establecer el dataview como itemsource a su datagrid y se actualiza.

    OriginalEl autor Joee

Dejar respuesta

Please enter your comment!
Please enter your name here