Điều khiển DataGridView trong winform để hiển thị dữ liệu dạng bảng(nhiều dòng, nhiều cột) ra giao diện.
Bạn có thể sử dụng nó để hiển thị dữ liệu dưới dạng bảng, cho phép người dùng chỉnh sửa, xoá, thêm dòng, sắp xếp, và tìm kiếm dữ liệu.

Dưới đây là hướng dẫn sử dụng DataGridView trong WinForms bằng C# để hiển thị dữ liệu
Mở Visual Studio và tạo một ứng dụng WinForms mới.
Chuyển qua phần thiết kế (Designer)
Trong cửa sổ thiết kế (Designer), kéo thả một DataGridView từ Toolbox vào Form.
Giả sử bạn có một bảng dữ liệu đơn giản về "Nhân viên" với các trường như "ID", "Tên", "Tuổi" và "Địa chỉ". Bạn có thể tạo một DataTable và liên kết nó với DataGridView.
using System;
using System.Data;
using System.Windows.Forms;
namespace DataGridViewExample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// Tạo DataTable
DataTable dataTable = new DataTable();
// Thêm các cột vào DataTable
dataTable.Columns.Add("ID", typeof(int));
dataTable.Columns.Add("Tên", typeof(string));
dataTable.Columns.Add("Tuổi", typeof(int));
dataTable.Columns.Add("Địa chỉ", typeof(string));
// Thêm một vài dòng dữ liệu mẫu
dataTable.Rows.Add(1, "Nguyễn Văn A", 30, "Hà Nội");
dataTable.Rows.Add(2, "Trần Thị B", 25, "TP. HCM");
dataTable.Rows.Add(3, "Lê Văn C", 28, "Đà Nẵng");
// Liên kết DataTable với DataGridView
dataGridView1.DataSource = dataTable;
}
}
}* Giải thích code trên như sau:
Tạo DataTable: Trong ví dụ trên, chúng ta tạo một đối tượng DataTable với các cột là "ID", "Tên", "Tuổi", và "Địa chỉ".
Thêm Dữ liệu: Sau đó, bạn thêm một số dòng dữ liệu vào bảng.
Liên kết DataGridView với DataTable: Cuối cùng, chúng ta gán DataTable làm nguồn dữ liệu cho DataGridView bằng cách sử dụng thuộc tính DataSource.
Gọi khi người dùng click vào một ô. Thường dùng để lấy dữ liệu ô hoặc chọn dòng.
// Đăng ký sự kiện (designer hoặc code)
dataGridView1.CellClick += dataGridView1_CellClick;
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0) return; // loại header
var value = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
MessageBox.Show($"Ô [{e.RowIndex},{e.ColumnIndex}] = {value}");
}Double-click vào ô. Thường dùng để mở form chi tiết hoặc bắt đầu chỉnh sửa nâng cao.
dataGridView1.CellDoubleClick += dataGridView1_CellDoubleClick;
private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0) return;
var id = dataGridView1.Rows[e.RowIndex].Cells["MaSP"].Value?.ToString();
// mở form chi tiết, truyền id
var frm = new DetailForm(id);
frm.ShowDialog();
}Gọi khi giá trị trong ô đã thay đổi (sau khi rời ô). Dùng để cập nhật dữ liệu nguồn hoặc lưu vào DB.
dataGridView1.CellValueChanged += dataGridView1_CellValueChanged;
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0) return;
var newValue = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightYellow;
}Quan trọng khi có ô dạng checkbox; dùng để commit ngay thay đổi của ô checkbox.
dataGridView1.CurrentCellDirtyStateChanged += dataGridView1_CurrentCellDirtyStateChanged;
private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dataGridView1.IsCurrentCellDirty)
{
dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}Gọi khi lựa chọn thay đổi (ví dụ thay dòng chọn). Dùng để cập nhật UI phụ (form chi tiết, nút).
dataGridView1.SelectionChanged += dataGridView1_SelectionChanged;
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
var row = dataGridView1.SelectedRows[0];
lblStatus.Text = $"Đang chọn: {row.Cells["TenSP"].Value}";
}
else
{
lblStatus.Text = "Chưa chọn dòng nào";
}
}Khi con trỏ chuyển sang một dòng mới. Thích hợp để load dữ liệu chi tiết của dòng đó.
dataGridView1.RowEnter += dataGridView1_RowEnter;
private void dataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0) return;
var ten = dataGridView1.Rows[e.RowIndex].Cells["TenSP"].Value;
txtTenSP.Text = ten?.ToString();
}Dùng để kiểm tra dữ liệu cả dòng trước khi rời dòng; có thể hủy để giữ lại con trỏ.
dataGridView1.RowValidating += dataGridView1_RowValidating;
private void dataGridView1.RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
var row = dataGridView1.Rows[e.RowIndex];
if (string.IsNullOrWhiteSpace(row.Cells["TenSP"].Value?.ToString()))
{
MessageBox.Show("Tên sản phẩm không được để trống");
e.Cancel = true; // giữ con trỏ ở dòng này
}
}Bắt lỗi khi binding hoặc chuyển kiểu dữ liệu sai (ví dụ nhập chữ vào cột số).
dataGridView1.DataError += dataGridView1_DataError;
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
MessageBox.Show("Giá trị nhập không hợp lệ.");
e.ThrowException = false;
}CellValueChanged chỉ kích hoạt sau khi ô được commit — với checkbox nên dùng CurrentCellDirtyStateChanged.e.RowIndex < 0 để bỏ qua header.
Chỉnh sửa dữ liệu: DataGridView mặc định cho phép người dùng chỉnh sửa các ô dữ liệu nếu bạn không vô hiệu hóa chế độ chỉnh sửa.
Thêm, xóa, và sửa dữ liệu: Bạn có thể thêm các tính năng để thêm, xóa, hoặc chỉnh sửa dữ liệu trực tiếp trong DataGridView.
Sắp xếp và lọc dữ liệu: DataGridView hỗ trợ sắp xếp và lọc dữ liệu ngay lập tức khi người dùng nhấp vào tiêu đề cột.
Bạn có thể thêm các sự kiện như CellClick, RowValidated, UserDeletingRow, v.v.
Bạn có thể thay đổi kiểu chữ, màu sắc, và các thuộc tính khác của các cột hoặc dòng dữ liệu.
Ví dụ để thay đổi màu sắc của một dòng khi người dùng click vào nó:
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
row.DefaultCellStyle.BackColor = Color.White; // Khôi phục màu gốc
}
DataGridViewRow clickedRow = dataGridView1.Rows[e.RowIndex];
clickedRow.DefaultCellStyle.BackColor = Color.LightBlue; // Đổi màu dòng đã chọn
}Khai báo đối tượng trong phần design.cs C#
Code dưới chỉ tham khảo vì trong Winform C# tự sinh ra khi kéo DataGridView vào FORM.
System.Windows.Forms.DataGridView this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.dataGridView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.Location = new System.Drawing.Point(5, 112);
this.dataGridView1.Name = "dataGridView1";
this.dataGridView1.Size = new System.Drawing.Size(798, 274);
// Thuộc tính DataSource để nạp giá trị vào dataGridView để hiển thị lên màn hình
Kiểu nạp vào DataSource kiểu gì: DataSet / DataTable / DataView / List ...
dataGridView1.DataSource =obj;
private void btLSua_Click(object sender, EventArgs e)
{
string ma = dataGridView1.CurrentRow.Cells["col_MaKhachHang"].Value.ToString();
MessageBox.Show(ma);
}
private void DuyetTatCaBieuDo()
{
// Duyệt qua tất cả các dòng trong DataGridView
foreach (DataGridViewRow row in dataGridView1.Rows)
{
// Kiểm tra dòng có phải là dòng không phải dòng tiêu đề không (nếu có)
if (!row.IsNewRow)
{
// Duyệt qua các ô trong từng dòng
foreach (DataGridViewCell cell in row.Cells)
{
// Lấy giá trị của từng ô
var cellValue = cell.Value;
Console.WriteLine(cellValue); // Hoặc xử lý giá trị của ô tại đây
}
}
}
}public void Delete()
{
int rowIndex = grvHangHoa.CurrentRow.Index;
grvHangHoa.Rows.RemoveAt(rowIndex);
}Bài tập winform 01
Bài tập winform 02
Bài tập winform 03 - thêm dữ liệu vào lưới
Bài tập winform 04 - lưu toàn bộ dữ liệu ra file xml.
Sau khi dữ liệu hiển thị trên gridview, hãy thêm 1 nút lệnh, sau khi click vào nút lệnh thì dữ liệu lưu ra file xml.
Hãy cùng tôi tham khảo các bài tập tại Khóa học Winform C#
Tìm kiếm: bài tập lớn DataGridview C#
Trong WinForms, DataGridView là một điều khiển (control) mạnh mẽ giúp hiển thị và tương tác với dữ liệu trong một bảng.