C#에서 DataTable 필터링

Syed Hassan Sabeeh Kazmi 2023년10월12일
  1. DataView.RowFilter 속성을 사용하여 C#에서 DataTable 필터링
  2. CopyToDataTable() 메서드를 사용하여 C#에서 DataTable 필터링
  3. Select() 메서드를 사용하여 C#에서 DataTable 필터링
C#에서 DataTable 필터링

.NET Framework의 DataView는 C#에서 DataTable의 사용자 지정 보기를 나타내는 필터링을 위한 databindtable을 나타냅니다. DataTable(DataView가 동기화되거나 연결됨)에는 필터링이 필요한 데이터가 포함되어 있습니다.

DataView는 데이터를 저장할 수 없으며 해당 DataTable의 데이터만 나타냅니다. DataView에서 수행된 모든 계산은 DataTable에 영향을 미칩니다.

또한 DataTable의 데이터를 변경하거나 수정하면 관련되거나 연결된 모든 DataViews에 영향을 미칩니다.

DataView 클래스는 C#의 System.Data 네임스페이스에 있습니다. 이 자습서에서는 C#에서 DataTable을 필터링하는 세 가지 기본 방법을 알려줍니다.

DataView.RowFilter 속성, CopytoDataTable()Select() 메서드는 C#에서 DataTable을 필터링하는 몇 가지 기본 방법입니다. 필터링은 데이터가 커지고 높은 수준의 조작이 필요하기 때문에 모든 C# 애플리케이션의 공통 요구 사항입니다.

DataView.RowFilter 속성을 사용하여 C#에서 DataTable 필터링

DataView.RowFilter 속성은 C#에서 DataTable을 필터링할 때 매우 생산적입니다. 이를 통해 DataView와 관련된 데이터를 가져오거나 설정할 수 있으며 각 DataTable에서 데이터를 필터링할 수 있는 개별 DataView 개체를 정의하는 데 도움이 됩니다.

RowFilter 속성은 행을 필터링하는 방법을 지정하는 문자열을 나타내며 해당 문자열의 값 데이터 유형은 System.String입니다. RowFilter 값을 username = "aUsername"으로 할당하고 DataView 행을 필터링하여 필터링된 데이터를 C# 애플리케이션에서 프로그래밍 방식으로 표시할 수 있습니다.

RowFilter 속성의 가장 흥미로운 점은 DataView가 동적 보기를 제공하는 기본 DataTable의 데이터를 변경/필터링하는 기능입니다. DataView의 동적 및 데이터 바인딩 기능은 데이터 바인딩 C# 애플리케이션에 이상적입니다.

DataTable에서 제공하는 보기와 마찬가지로 C#의 DataView는 단일 데이터 세트를 동적으로 나타낼 수 있으므로 다양한 필터를 수행할 수 있습니다. RowFilter 속성을 DataView에 적용할 수 있습니다. 그러면 필터 식 또는 기준과 일치하지 않는 관련 DataTable 개체 행 컬렉션의 불필요한 모든 데이터가 숨겨집니다.

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

출력:

*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

CreateTable() 메서드는 id, nameaddress 열을 포함하는 FilterUserDataTable 데이터 테이블을 생성합니다. button2 버튼은 이 DataTable의 데이터를 dataGridView1에 바인딩할 수 있습니다.

button1을 눌러 DataTable을 필터링하고 필터링된 결과를 dataGridView1에 표시합니다.

CopyToDataTable() 메서드를 사용하여 C#에서 DataTable 필터링

DataTable을 필터링하고 DataView가 아닌 새 DataTable에서 결과를 반환할 수 있습니다. 결과적으로 새 DataTable에는 입력 IEnumberable<T> 개체가 지정된 DataRow 개체의 복사본이 포함됩니다.

DataTable의 소스 IEnumerable<T>null일 수 없습니다. 그렇지 않으면 새 DataTable을 생성할 수 없습니다. 쿼리를 기반으로 DataTable을 선택하고 DataGridView의 프록시 역할을 하는 BindingSource에 바인딩된 새 항목에 콘텐츠를 복사합니다.

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

출력:

*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

_newFilteredDataTableFilterUserDataTable DataTable(여기서 id = 1001)의 필터링된 데이터를 보유합니다. 이 C# 코드는 이 button1_Click 이벤트 코드를 붙여넣어 이전 C# 예제에서 실행 가능합니다.

Select() 메서드를 사용하여 C#에서 DataTable 필터링

Select() 메서드는 DataTable 시퀀스의 각 요소를 새 형식으로 투영합니다. 이는 System.Linq 네임스페이스에 속하므로 LINQ를 사용하여 C#의 DataTable에서 필터링된 데이터를 검색하는 개발자에게 희소식입니다.

이 메서드는 개체를 반환 값으로 사용하고 작업을 수행하는 데 필요한 모든 정보를 저장합니다. 이 경우 조건인 하나의 문자열 인수를 사용하여 DataRow 개체의 데이터 배열을 가져옵니다.

조건과 함께 Select() 메서드를 매개 변수로 사용하여 DataTable을 쿼리하고 결과를 얻은 후 반복하여 필요한 필드를 인쇄할 수 있습니다. DataTable.Select() 식을 사용하여 배열 또는 DataTable에 필터 행을 할당합니다.

즉, DataTableSelect() 메서드는 필터를 수락하고 반환되는 인수를 정렬한 다음 DataRow 개체의 배열로 전송합니다. 필터링된 DataTable 행을 포함하는 DataRow 객체는 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]);
}

출력:

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

C#에서 방대한 양의 데이터를 처리할 때 DataTable은 중추적인 역할을 합니다. 이 자습서에서는 C#에서 DataTable을 필터링하는 세 가지 방법을 설명했습니다.

DataTable 필터링 방법은 DataTable에서 데이터를 가져오고 조작할 때 최적화되고 효율적이어야 합니다.

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

관련 문장 - Csharp DataTable