Chương 8 Ứng dụng Windows với WindowsForm
9.9.2. Cập nhật một dòng dữ liệu
Khi người dùng nhấn Button Update (cập nhật), ta sẽ lấy chỉ mục được chọn trên ListBox, và lấy ra dòng dữ liệu DataRow trong bảng ứng với chỉ mục trên. Sau
đó cập nhật DataSet với dòng dữ liệu mới này nếu sau khi kiểm tra thấy chúng không có lỗi nào cả. Chi tiết về quá trình thực hiện cập nhật:
Đầu tiên ta sẽ lấy về dòng dữ liệu người dùng muốn thay đổi từ đối tượng dataTable mà ta đã khai báo làm biến thành viên ngay từđầu:
DataRow targetRow = dataTable.Rows[lbCustomers.SelectedIndex];
Hiển thị chuỗi thông báo cập nhật dòng dữ liệu đó cho người dùng biết. Để
làm điều này ta sẽ gọi phương thức tình DoEvents() của đối tượng Application, hàm này sẽ giúp sơn mới lại màn hình với thông điệp hay các thay đổi khác.
lblMessage.Text = "Updating " + targetRow["CompanyName"]; Application.DoEvents();
chế độ hiệu chỉnh ( Edit ) và EndEdit() để kết thúc chếđộ hiệu chỉnh dòng. targetRow.BeginEdit();
targetRow["CompanyName"] = txtCustomerName.Text; targetRow.EndEdit();
Lấy về các thay đổi trên đối tượng DataSet để kiểm tra xem các thay đổi có xảy ra bất kỳ lỗi nào không. Ởđây ta sẽ dùng một biến cờ có kiểu true/false để xác
định là có lỗi là true, không có lỗi là false.Kiểm tra lỗi bằng cách dùng hai vòng lặp tuần tự trên bảng và dòng của DataSet mới lấy về ở trên, ta dùng thuộc tính HasErrors để kiểm tra lỗi trên bảng, phương thức GetErrors() để lấy về các dòng có lỗi trong bảng.
DataSet DataSetChanged;
DataSetChanged = DataSet.GetChanges(DataRowState.Modified); bool okayFlag = true;
if (DataSetChanged.HasErrors) {
okayFlag = false;
string msg = "Error in row with customer ID ";
foreach (DataTable theTable in DataSetChanged.Tables) {
if (theTable.HasErrors) {
DataRow[] errorRows = theTable.GetErrors( ); foreach (DataRow theRow in errorRows)
msg = msg + theRow["CustomerID"]; }
}
lblMessage.Text = msg; }
Nếu biến cờ okagFlag là true,thì ta sẽ trộn DataSet ban đầu với DataSet thay
đổi thành một, sau đó cập nhật DataSet sau khi trộn này vào cơ sở dữ liệu. if (okayFlag)
{
DataSet.Merge(DataSetChanged);
DataAdapter.Update(DataSet,"Customers");
Tiếp theo hiển thị câu lệnh truy vấn cho người dùng biết, và cập nhật những thay đổi cho DataSet đầu tiên, rồi hiển thị dữ liệu mới lên đối tượng ListBox.
lblMessage.Text = DataAdapter.UpdateCommand.CommandText; Application.DoEvents( );
DataSet.AcceptChanges( ); PopulateLB( );
Nếu cờ okayFlag là false, có nghĩa là có lỗi trong quá trình hiệu chỉnh dữ liệu, ta sẽ từ chối các thay đổi trên DataSet.
else
DataSet.RejectChanges( );