Filtrar un DataTable en C#

Syed Hassan Sabeeh Kazmi 12 octubre 2023
  1. Utilice la propiedad DataView.RowFilter para filtrar la Tabla de datos en C#
  2. Utilice el método CopyToDataTable() para filtrar la Tabla de datos en C#
  3. Utilice el método Select() para filtrar la Tabla de datos en C#
Filtrar un DataTable en C#

El DataView de .NET Framework representa un databindtable para filtrar, que representa una vista personalizada de un DataTable en C#. El DataTable (el DataView está sincronizado o conectado) contiene datos que requieren filtrado.

Un DataView no puede almacenar datos y solo representa datos de su correspondiente DataTable. Cualquier cálculo realizado en un DataView afecta a la DataTable.

Además, cambiar o modificar los datos de un DataTable afectará a todos sus DataViews asociados o conectados.

La clase DataView existe en el espacio de nombres System.Data en C#. Este tutorial le enseñará los tres métodos principales para filtrar una Tabla de datos en C#.

La propiedad DataView.RowFilter, los métodos CopytoDataTable() y Select() son algunas de las principales formas de filtrar una DataTable en C#. El filtrado es un requisito común para todas las aplicaciones de C# porque los datos son cada vez más grandes y requieren una manipulación de alto nivel.

Utilice la propiedad DataView.RowFilter para filtrar la Tabla de datos en C#

La propiedad DataView.RowFilter es extremadamente productiva al filtrar un DataTable en C#. Le permite obtener o establecer los datos asociados con un DataView y le ayuda a definir los objetos individuales de DataView que pueden filtrar los datos en cada DataTable.

La propiedad RowFilter representa una cadena que especifica cómo se filtrarán las filas, y el tipo de datos de valor de esa cadena es System.String. Puede asignar un valor RowFilter como username = "aUsername" y filtrar las filas de DataView para mostrar los datos filtrados mediante programación en una aplicación C#.

Lo más interesante de la propiedad RowFilter es su capacidad para cambiar/filtrar datos de DataTable subyacente, de los cuales un DataView proporciona una vista dinámica. Las capacidades dinámicas y de enlace de datos de DataView lo hacen ideal para aplicaciones C# de enlace de datos.

Similar a la vista proporcionada por un DataTable, un DataView en C# puede representar dinámicamente un solo conjunto de datos, lo que le permite realizar diferentes filtros. Puede aplicar la propiedad RowFilter a un DataView, que ocultará todos los datos innecesarios de la colección de filas de su objeto DataTable asociado que no coincida con la expresión o el criterio del filtro.

using System;
using System.Data;
using System.Windows.Forms;

namespace DataTableExp {
  public partial class Form1 : Form {
    private DataSet dtSet;

    public Form1() {
      InitializeComponent();
      CreateTable();
    }

    private void CreateTable() {
      // Create a new DataTable.
      DataTable filterExpCust = new DataTable("FilterUserDataTable");
      DataColumn filterExpColumn;
      DataRow filterExpDRow;

      // create an `id` column
      filterExpColumn = new DataColumn();
      // define the column's type
      filterExpColumn.DataType = typeof(Int32);
      filterExpColumn.ColumnName = "id";  // column name
      filterExpColumn.Caption = "User Account `ID`";
      filterExpColumn.ReadOnly = false;
      filterExpColumn.Unique = true;

      // Add column to the DataColumnCollection.
      filterExpCust.Columns.Add(filterExpColumn);

      // create a `name` column
      filterExpColumn = new DataColumn();
      filterExpColumn.DataType = typeof(String);
      filterExpColumn.ColumnName = "Name";  // column name
      filterExpColumn.Caption = "User Account `Name`";
      filterExpColumn.AutoIncrement = false;
      filterExpColumn.ReadOnly = false;
      filterExpColumn.Unique = false;

      // Add column to the DataColumnCollection.
      filterExpCust.Columns.Add(filterExpColumn);

      // create an `address` column
      filterExpColumn = new DataColumn();
      filterExpColumn.DataType = typeof(String);
      filterExpColumn.ColumnName = "Address";  // column name
      filterExpColumn.Caption = "User Account Address";
      filterExpColumn.ReadOnly = false;
      filterExpColumn.Unique = false;

      // add colume to the `filterExpColumn`
      filterExpCust.Columns.Add(filterExpColumn);

      // make the `id` the primary key of the table
      DataColumn[] PrimaryKeyColumns = new DataColumn[1];
      PrimaryKeyColumns[0] = filterExpCust.Columns["id"];
      filterExpCust.PrimaryKey = PrimaryKeyColumns;

      // create a new DataSet
      dtSet = new DataSet();

      // add `FilterUserDataTable` table to the DataSet.
      dtSet.Tables.Add(filterExpCust);

      // add data rows to the `FilterUserDataTable` table using the `NewRow` method

      // first user details
      filterExpDRow = filterExpCust.NewRow();
      filterExpDRow["id"] = 1001;
      filterExpDRow["Name"] = "Stephan Hawking";
      filterExpDRow["Address"] = "79 Gulberg Road, Havana, Cuba";
      filterExpCust.Rows.Add(filterExpDRow);

      // second user details
      filterExpDRow = filterExpCust.NewRow();
      filterExpDRow["id"] = 1002;
      filterExpDRow["name"] = "John Snow";
      filterExpDRow["Address"] = " The Kings Landing, North California";
      filterExpCust.Rows.Add(filterExpDRow);

      // third user details
      filterExpDRow = filterExpCust.NewRow();
      filterExpDRow["id"] = 1003;
      filterExpDRow["Name"] = "Scooby Doo";
      filterExpDRow["Address"] = "194 St. Patrick Avenue, London, UK";
      filterExpCust.Rows.Add(filterExpDRow);
    }

    private void button2_Click(object sender, EventArgs e) {
      // Create a BindingSource
      BindingSource bs = new BindingSource();
      bs.DataSource = dtSet.Tables["FilterUserDataTable"];

      // Bind data to DataGridView.DataSource
      dataGridView1.DataSource = bs;
    }

    private void button1_Click(object sender, EventArgs e) {
      // filter the datatable
      // create a customers table and access it into a `dv` DataView
      DataView dv = new DataView(dtSet.Tables["FilterUserDataTable"]);

      // it will filter the row where `id` is `1001`
      dv.RowFilter = "id = 1001";

      // output the filtered datatable in a `dataGridView1` data grid view
      dataGridView1.DataSource = dv;
    }
  }
}

Producción :

*click `button2` to bind data to a data grid view*
*click `button2` to filter datatable*

id        Name                Address
1001      Stephan Hawking     79 Gulberg Road, Havana, Cuba

El método CreateTable() crea una tabla de datos FilterUserDataTable que contiene las columnas id, name y address. El botón button2 puede vincular los datos de este DataTable a dataGridView1.

Presiona button1 para filtrar el DataTable y mostrar los resultados filtrados en el dataGridView1.

Utilice el método CopyToDataTable() para filtrar la Tabla de datos en C#

Puede filtrar una Tabla de datos y devolver los resultados en una nueva Tabla de datos en lugar de una Vista de datos. Una nueva DataTable, como resultado, contiene copias de un objeto DataRow, dado un objeto de entrada IEnumberable<T>.

La fuente IEnumerable<T> de la DataTable no puede ser null; de lo contrario, no se podrá crear la nueva Tabla de datos. Se basa en una consulta para seleccionar un DataTable y copiar su contenido en uno nuevo vinculado a BindingSource, que actúa como proxy para DataGridView.

private void button1_Click(object sender, EventArgs e) {
  DataTable _newFilteredDataTable =
      dtSet.Tables["FilterUserDataTable"].Select("id = 1001").CopyToDataTable();
  dataGridView1.DataSource = _newFilteredDataTable;
}

Producción :

*click `button2` to bind data to a data grid view*
*click `button2` to filter datatable*

id        Name                Address
1001      Stephan Hawking     79 Gulberg Road, Havana, Cuba

El _newFilteredDataTable contendrá los datos filtrados de FilterUserDataTable DataTable donde id = 1001. Este código C# es ejecutable en el ejemplo anterior de C# pegando este código de evento button1_Click.

Utilice el método Select() para filtrar la Tabla de datos en C#

El método Select() proyecta cada elemento de una secuencia de un DataTable en un nuevo formulario. Como pertenece al espacio de nombres System.Linq, es una gran noticia para los desarrolladores que disfrutan usando LINQ para recuperar datos filtrados de un DataTable en C#.

Este método utiliza un objeto como valor de retorno y almacena toda la información necesaria para realizar la acción. Obtiene la matriz de datos de los objetos DataRow utilizando un argumento de cadena, que es la condición en este caso.

Puede usar el método Select() con la condición como parámetro para consultar la Tabla de datos, y después de obtener el resultado, puede recorrerlo e imprimir los campos requeridos. Asigne filas de filtro a una matriz o DataTable utilizando la expresión DataTable.Select().

En otras palabras, el método Select() de una DataTable acepta un filtro, ordena los argumentos a cambio y los transfiere a una matriz de objetos DataRow. Los objetos DataRow que contienen las filas filtradas de DataTable confirman los criterios en una FilterExpression.

// `dataTable` is the targeted DataTable in a C# program which contains data
// use `Select("id > 30")` to filter the data from `dataTable` where `id` is greater than `30`
// the `filterResult` will contain the filtered information of the `dataTable`

DataRow[] filterResult = dataTable.Select("id > 30");

foreach (DataRow filterRow in filterResult) {
  Console.WriteLine("ID: {0} Name: {1} Address: {2}", filterRow[0], filterRow[1], filterRow[2]);
}

Producción :

ID: 1003, Name: Scooby Doo, Address: 194 St. Patrick Avenue, London, UK

Cuando se trata de una gran cantidad de datos en C#, DataTable juega un papel fundamental. Este tutorial le ha enseñado tres métodos diferentes para filtrar una Tabla de datos en C#.

Los métodos de filtrado de una Tabla de datos deben optimizarse y ser eficientes en la obtención y manipulación de datos de una Tabla de datos.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

Artículo relacionado - Csharp DataTable