Filtern Sie eine DataTable in C#

Syed Hassan Sabeeh Kazmi 12 Oktober 2023
  1. Verwenden Sie die Eigenschaft DataView.RowFilter, um die DataTable in C# zu filtern
  2. Verwenden Sie die Methode CopyToDataTable(), um die DataTable in C# zu filtern
  3. Verwenden Sie die Select()-Methode, um die DataTable in C# zu filtern
Filtern Sie eine DataTable in C#

Der DataView des .NET Frameworks stellt eine databindtable zum Filtern dar, die eine angepasste Ansicht einer DataTable in C# darstellt. Die DataTable (mit der DataView synchronisiert oder verbunden ist) enthält Daten, die gefiltert werden müssen.

Ein DataView kann keine Daten speichern und repräsentiert nur Daten seiner entsprechenden DataTable. Alle Berechnungen, die auf einer DataView durchgeführt werden, wirken sich auf die DataTable aus.

Darüber hinaus wirkt sich das Ändern oder Modifizieren der Daten einer DataTable auf alle zugehörigen oder verbundenen DataViews aus.

Die Klasse DataView existiert im Namensraum System.Data in C#. In diesem Tutorial lernen Sie die drei wichtigsten Methoden zum Filtern einer DataTable in C# kennen.

Die Eigenschaft DataView.RowFilter, die Methoden CopytoDataTable() und Select() sind einige der wichtigsten Methoden zum Filtern einer DataTable in C#. Die Filterung ist eine häufige Anforderung für jede C#-Anwendung, da die Daten immer größer werden und eine Manipulation auf hoher Ebene erfordern.

Verwenden Sie die Eigenschaft DataView.RowFilter, um die DataTable in C# zu filtern

Die Eigenschaft DataView.RowFilter ist beim Filtern einer DataTable in C# äusserst produktiv. Es ermöglicht Ihnen, die mit einer DataView verknüpften Daten abzurufen oder festzulegen, und hilft Ihnen, die einzelnen DataView-Objekte zu definieren, die die Daten in jeder DataTable filtern können.

Die Eigenschaft RowFilter stellt eine Zeichenfolge dar, die angibt, wie Zeilen gefiltert werden sollen, und der Wertdatentyp dieser Zeichenfolge ist System.String. Sie können einen RowFilter-Wert als username = "aUsername" zuweisen und die Zeilen von DataView filtern, um gefilterte Daten programmgesteuert in einer C#-Anwendung anzuzeigen.

Das Interessanteste an der Eigenschaft RowFilter ist ihre Fähigkeit, Daten der zugrunde liegenden DataTable zu ändern/filtern, von denen eine DataView eine dynamische Ansicht bietet. Die dynamischen und Datenbindungsfunktionen einer DataView machen sie ideal für die Datenbindung von C#-Anwendungen.

Ähnlich wie die Ansicht einer DataTable kann eine DataView in C# dynamisch einen einzelnen Datensatz darstellen, wodurch Sie verschiedene Filter durchführen können. Sie können die Eigenschaft RowFilter auf eine DataView anwenden, wodurch alle unnötigen Daten der Zeilensammlung des zugehörigen DataTable-Objekts ausgeblendet werden, die nicht mit dem Filterausdruck oder den Filterkriterien übereinstimmen.

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

Ausgang:

*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

Die Methode CreateTable() erstellt eine Datentabelle FilterUserDataTable, die die Spalten id, name und address enthält. Die Schaltfläche button2 kann die Daten dieser DataTable an dataGridView1 binden.

Drücken Sie button1, um die DataTable zu filtern und die gefilterten Ergebnisse in der dataGridView1 anzuzeigen.

Verwenden Sie die Methode CopyToDataTable(), um die DataTable in C# zu filtern

Sie können eine DataTable filtern und die Ergebnisse in einer neuen DataTable statt in einer DataView zurückgeben. Eine neue DataTable enthält als Ergebnis Kopien eines DataRow-Objekts, wenn ein IEnumberable<T>-Eingabeobjekt gegeben ist.

Die Quelle IEnumerable<T> der DataTable darf nicht null sein; Andernfalls kann die neue DataTable nicht erstellt werden. Es basiert auf einer Abfrage, um eine DataTable auszuwählen und ihren Inhalt in eine neue zu kopieren, die an BindingSource gebunden ist, die als Proxy für DataGridView fungiert.

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

Ausgang:

*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

Die _newFilteredDataTable enthält die gefilterten Daten von FilterUserDataTable DataTable, wobei id = 1001. Dieser C#-Code ist im vorherigen C#-Beispiel durch Einfügen dieses button1_Click-Ereigniscodes ausführbar.

Verwenden Sie die Select()-Methode, um die DataTable in C# zu filtern

Die Methode Select() projiziert jedes Element einer Sequenz einer DataTable in eine neue Form. Da es zum Namespace System.Linq gehört, ist es eine gute Nachricht für Entwickler, die gerne LINQ verwenden, um gefilterte Daten aus einer DataTable in C# abzurufen.

Diese Methode verwendet ein Objekt als Rückgabewert und speichert alle Informationen, die zum Ausführen der Aktion erforderlich sind. Es erhält das Array von Daten von DataRow-Objekten mit einem String-Argument, was in diesem Fall die Bedingung ist.

Sie können die Methode Select() mit der Bedingung als Parameter verwenden, um die DataTable abzufragen, und nachdem Sie das Ergebnis erhalten haben, können Sie es durchlaufen und die erforderlichen Felder drucken. Weisen Sie mit dem Ausdruck DataTable.Select() Filterzeilen einem Array oder einer DataTable zu.

Anders ausgedrückt: Die Select()-Methode einer DataTable akzeptiert einen Filter, sortiert im Gegenzug die Argumente und übergibt sie an ein Array von DataRow-Objekten. Die DataRow-Objekte, die die gefilterten DataTable-Zeilen enthalten, bestätigen die Kriterien in einem 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]);
}

Ausgang:

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

Beim Umgang mit riesigen Datenmengen in C# spielt DataTable eine zentrale Rolle. Dieses Tutorial hat Ihnen drei verschiedene Methoden beigebracht, um eine DataTable in C# zu filtern.

Die Methoden zum Filtern einer DataTable sollten beim Abrufen und Manipulieren von Daten aus einer DataTable optimiert und effizient sein.

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

Verwandter Artikel - Csharp DataTable