01/10/2018, 17:26

Dùng hàm Select() để lọc dữ liệu từ DataTable trong C#

Hôm nay Góc kinh Nghiệm sẽ trình bày cách dùng hàm Select() của đối tượng DataTable để lọc ra dữ liệu mong muốn. Ví dụ bên dưới sẽ dùng hàm Select() của lớp System.Data.DataTable để lọc ra tất các nhân viên có giới tính là “Nam”. Góc Kinh Nghiệm giả sử chúng ta đã có các đối tượng ...

Hôm nay Góc kinh Nghiệm sẽ trình bày cách dùng hàm Select() của đối tượng DataTable để lọc ra dữ liệu mong muốn. Ví dụ bên dưới sẽ dùng hàm Select() của lớp System.Data.DataTable để lọc ra tất các nhân viên có giới tính là “Nam”.

Góc Kinh Nghiệm giả sử chúng ta đã có các đối tượng sau:

  • Form chính tên FormSelectData
  • Đối tượng DataGridView tên grvData
  • Đối tượng Button tên btnSelect và sự kiện khi click chuột lên nút btnSelect là btnSelect_Click()
  • Đối tượng DataTable tên data dùng để chứa thông tin nhân viên, đối tượng data có 3 cột: mã nhân viên, tên nhân viên, giới tính

Cách thực hiện như sau:

  • Bước 1: Khởi tạo 3 nhân viên & hiển thị 3 nhân viên đó lên grvData
  • Bước 2: Khi nhấn nút “Lọc dữ liệu”, chương trình sẽ gọi sự kiện btnSelect_Click(), và sự kiện btnSelect_Click() sẽ gọi hàm SelectData().
  • Bước 3: Khi gọi hàm SelectData() ở bước 2, chuỗi điều kiện lọc được tạo ra như sau:
// Lọc ra các nhân viên nam
string filterExpression = "";
filterExpression = "GioiTinh ='Nam'";

Sau đó dùng hàm Select để lọc ra dữ liệu:

DataRow[] rows = pData.Select(filterExpression);

Dữ liệu sau khi lọc sẽ trả về một mãng các dòng đối tượng là DataRow

  • Bước 4: Cuối cùng là hiển thị dữ liệu đã được lọc ra lên đối tượng grvData

Dưới đây là đoạn code mình họa:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace MyProject
{
   public partial class FormSelectData : Form
   {
      public FormSelectData()
      {
         InitializeComponent();
      }

      private void FormSelectData_Load(object sender, EventArgs e)
      {
         // Bước 1
         // Tạo ra 3 nhân viên cho đối tượng DataGridView tên grvData
         // Tạo đối tượng DataTable tên data
         DataTable data = new DataTable();

         // Đối tượng data có 3 cột: Mã nhân viên, tên nhân viên và giới tính
         data.Columns.Add("MaNhanVien", typeof(string));
         data.Columns.Add("TenNhanVien", typeof(string));
         data.Columns.Add("GioiTinh", typeof(string));

         // Khởi tạo 3 nhân viên cho đối tượng data
         // Nhân viên 1
         DataRow empployee1 = data.NewRow();
         empployee1["MaNhanVien"] = "NV01";
         empployee1["TenNhanVien"] = "Nguyễn Khánh Hưng";
         empployee1["GioiTinh"] = "Nam";
         data.Rows.Add(empployee1);

         // Nhân viên 2
         DataRow empployee2 = data.NewRow();
         empployee2["MaNhanVien"] = "NV02";
         empployee2["TenNhanVien"] = "Đoàn Thanh Thúy";
         empployee2["GioiTinh"] = "Nữ";
         data.Rows.Add(empployee2);

         // Nhân viên 3
         DataRow empployee3 = data.NewRow();
         empployee3["MaNhanVien"] = "NV03";
         empployee3["TenNhanVien"] = "Trần Xuân Vũ";
         empployee3["GioiTinh"] = "Nam";
         data.Rows.Add(empployee3);

         // Hiển thị dữ liệu lên DataGridVidew
         grvData.DataSource = data;
      }

      private void btnSelect_Click(object sender, EventArgs e)
      {
         // Bước 2
         SelectData((DataTable)grvData.DataSource);
      }

      private void SelectData(DataTable pData)
      {
         // Bước 3
         // Lọc ra các nhân viên nam
         string filterExpression = "";
         filterExpression = "GioiTinh ='Nam'";
         DataRow[] rows = pData.Select(filterExpression);

         // Bước 4
         // Hiển thị dữ liệu đã được lọc ra
         pData = ((DataTable)grvData.DataSource).Clone();
         for (int i = 0; i < rows.Length; i++)
         {
            DataRow row = pData.NewRow();
            row[0] = rows[i].ItemArray[0].ToString();
            row[1] = rows[i].ItemArray[1].ToString();
            row[2] = rows[i].ItemArray[2].ToString();
            pData.Rows.Add(row);
         }
         grvData.DataSource = pData;
      }
   }
}

Kết quả khi chạy chương trình:

Sau đó nhấn nút “Lọc dữ liệu” -> sẽ được kết quả bên dưới:

Mở rộng:

Ngoài ra, bạn có thể sử dụng các điều kiện lọc tương tự như SQL để làm điều kiện lọc. Như thế sẽ làm cho việc lọc dữ liệu của bạn thêm phong phú. Góc Kinh Nghiệm đưa ra một vài điều kiện lọc mở rộng bên dưới để bạn có thể tham khảo:

  • “GioiTinh=’Nam’ AND MaNhanVien=’NV01’” -> kết quả trả về là chỉ có một nhân viên tên “Nguyễn Khánh Hưng”;
  • “MaNhanVien in (‘NV01’,’NV02’)” -> Kết quả trả về là 2 nhân viên tên “Nguyễn Khánh Hưng” & “Đoàn Thanh Thúy”
  • “MaNhanVien in (‘NV01’,’NV02’) AND GioiTinh=’Nữ’” -> Kết quả trả về là 1 nhân viên tên “Đoàn Thanh Thúy”

Góc Kinh Nghiệm lưu ý một số điểm sau:

  • Điều kiện lọc tương tự như SQL, nếu bạn biết SQL thì đây là một lợi thế rất lớn cho bạn
  • Đối với kiểu dữ liệu chữ sẽ có cặp dấu nháy đơn bao bọc ví dụ ‘NV01’
  • Đối với dữ liệu sô ví dụ như tuổi thì không có dấu nháy đơn bao bọc.

Góc Kinh Nghiệm chúc các bạn thành công!  :lol:


0