• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

GẮN KẾT VỚI LÈO LÁI DỮ LIỆU

Các mẹo vặt linh tinh không thuộc các nhóm trên

Điều hành viên: tungcan5diop, QUANITGROBEST

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

GẮN KẾT VỚI LÈO LÁI DỮ LIỆU

Gửi bàigửi bởi neverland87 » T.Sáu 30/05/2008 12:53 am

Tên bài viết: GẮN KẾT VỚI LÈO LÁI DỮ LIỆU
Tác giả: neverland87
Cấp độ bài viết: Chưa đánh giá
Tóm tắt:


Một tính năng thường phải có trong các ứng dụng xử lý các dữ liệu trên các CSDL là khả năng đi tới đi lui trên một tập hợp các mẫu tin. Ta thường gọi các động tác này là data navigation, lèo lái xuyên dữ liệu. Việc này đòi hỏi các ô control tham gia vào việc hiển thị thông tin phải nhịp nhàng với các mẫu tin hiện hành. Bài viết này sẽ hướng dẫn các bạn làm ra ứng dụng mẫu đáp ứng tính năng này.

Ứng dụng này bao gồm: 7 label, 6 textbox, 4 button như hình sau:

Hình ảnh


Mã: Chọn hết

  1. private System.Windows.Forms.Label label1;
  2.         private System.Windows.Forms.TextBox txtProductID;
  3.         private System.Windows.Forms.Label label2;
  4.         private System.Windows.Forms.TextBox txtProductName;
  5.         private System.Windows.Forms.Label label3;
  6.         private System.Windows.Forms.TextBox txtUnitPrice;
  7.         private System.Windows.Forms.Label label4;
  8.         private System.Windows.Forms.TextBox txtUnitsInStock;
  9.         private System.Windows.Forms.Label label5;
  10.         private System.Windows.Forms.TextBox txtUnitsOnOrder;
  11.         private System.Windows.Forms.Label label6;
  12.         private System.Windows.Forms.TextBox txtDiscontinued;
  13.         private System.Windows.Forms.Button btnFirst;
  14.         private System.Windows.Forms.Button btnPrevious;
  15.         private System.Windows.Forms.Button btnLast;
  16.         private System.Windows.Forms.Button btnNext;
  17.         private System.Windows.Forms.Label lblRecord;


Kế đến bạn “du nhập” namespace:

Mã: Chọn hết

  1. using System.Data.SqlClient;


Và xây dựng 2 biến thành viên sau:

Mã: Chọn hết

  1. private DataTable dtbProducts = new DataTable();
  2. private CurrencyManager cmProducts;


Kế tiếp, bạn bắt đầu các phương thức khá quan trọng sau:

Mã: Chọn hết

  1. //tạo các mối binding ứng với từng ô control
  2.         private void BuildDataBinding()
  3.         {
  4.             txtProductID.DataBindings.Add("Text", dtbProducts, "ProductID");
  5.  
  6.             txtProductName.DataBindings.Add("Text", dtbProducts, "ProductName");
  7.  
  8.             txtUnitsInStock.DataBindings.Add("Text", dtbProducts, "UnitsInStock");
  9.  
  10.             txtUnitsOnOrder.DataBindings.Add("Text", dtbProducts, "UnitsOnOrder");
  11.  
  12.             Binding DiscontinuedBinding = new Binding("Text", dtbProducts, "Discontinued");
  13.             DiscontinuedBinding.Format +=new ConvertEventHandler(BoolToYesNo);
  14.             txtDiscontinued.DataBindings.Add(DiscontinuedBinding);
  15.  
  16.             Binding UnitPriceBinding = new Binding("Text", dtbProducts, "UnitPrice");
  17.             UnitPriceBinding.Format += new ConvertEventHandler(DecimalToCurrencyString);
  18.             txtUnitPrice.DataBindings.Add(UnitPriceBinding);
  19.  
  20.             cmProducts = (CurrencyManager) this.BindingContext[dtbProducts];
  21.             cmProducts.PositionChanged += new EventHandler(cmProducts_PositionChanged);
  22.             lblRecord.Text = "Record " + (cmProducts.Position + 1).ToString() + " of " + cmProducts.Count.ToString();
  23.         }


Mã: Chọn hết

  1.        //phương thức thụ lý tình huống khi thay đổi bản ghi
  2.         private void cmProducts_PositionChanged(object sender, EventArgs e)
  3.         {
  4.             lblRecord.Text = "Record " + (cmProducts.Position + 1).ToString() + " of " + cmProducts.Count.ToString();
  5.         }


Mã: Chọn hết

  1.        private void DecimalToCurrencyString(object sender, ConvertEventArgs e)
  2.         {
  3.             if (e.DesiredType != typeof(string))
  4.                 return;
  5.             e.Value = ((decimal)e.Value).ToString("c");
  6.         }
  7.         private void BoolToYesNo(object sender, ConvertEventArgs e)
  8.         {
  9.             if (e.DesiredType != typeof(string))
  10.             {
  11.                 return;
  12.             }
  13.             if ((bool)e.Value == true)
  14.             {
  15.                 e.Value = "Yes";
  16.             }
  17.             else
  18.                 e.Value = "No";
  19.         }


Kế tiếp, bạn thụ lý tình huống Load của Form chính như sau:

Mã: Chọn hết

  1.  
  2. private void Form1_Load(object sender, EventArgs e)
  3.         {
  4.             try
  5.             {
  6.                 string connString = @"server = .\sqlexpress;integrated security = true;database = northwind;";
  7.                 SqlConnection conn = new SqlConnection(connString);
  8.                 string selectCmd = "SELECT ProductID,ProductName,UnitPrice,UnitsInStock,UnitsOnOrder,Discontinued FROM Products";
  9.                 SqlDataAdapter dadProducts = new SqlDataAdapter(selectCmd, conn);
  10.                 dadProducts.Fill(dtbProducts);
  11.                 BuildDataBinding();
  12.                 conn.Close();
  13.             }
  14.             catch (SqlException ex)
  15.             {
  16.                 MessageBox.Show(ex.Message);
  17.             }
  18.         }


Và thụ lý từng tình huống Click cho 4 button:

Mã: Chọn hết

  1. private void btnNext_Click(object sender, EventArgs e)
  2.         {
  3.             cmProducts.Position++;
  4.         }
  5.  
  6.         private void btnPrevious_Click(object sender, EventArgs e)
  7.         {
  8.             cmProducts.Position--;
  9.         }
  10.  
  11.         private void btnFirst_Click(object sender, EventArgs e)
  12.         {
  13.             cmProducts.Position = 0;
  14.         }
  15.  
  16.         private void btnLast_Click(object sender, EventArgs e)
  17.         {
  18.             cmProducts.Position = cmProducts.Count - 1;
  19.         }


SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Re: GẮN KẾT VỚI LÈO LÁI DỮ LIỆU

Gửi bàigửi bởi neverland87 » T.Sáu 30/05/2008 12:55 am

Sau khi đã xây dựng xong ứng dụng mẫu trên, mình xin giải thích vài khái niệm cơ bản:
- Với simple data binding, bạn có thể gắn kết bất cứ thuộc tính nào của bất cứ control nào với hầu hết bất cứ kiểu dữ liệu .NET hỗ trợ. Những control nào trưng ra một hoặc hai thuộc tính thích hợp với việc gắn kết dữ liệu, chẳng hạn các thuộc tính Text và Tag của TextBox control.
- CurrencyManager:
+ Sau khi các control đã được gắn kết với dữ liệu, ta phải giữ chúng hoạt động nhịp nhàng với nhau khi người sử dụng lần theo bảng danh sách chính các mẫu tin. Nên nhớ, các dữ liệu nguồn .NET, kể các DataSet, không có khái niệm về mẫu tin hiện hành. Thay vào đó, sự hỗ trợ sẽ được cung cấp bởi lớp CurrencyManager.
+ Lớp CurrencyManager chủ trì việc quản lý hoạt động của tất cả các đối tượng Binding được gắn liền với một dữ liệu nguồn đặc biệt nào đó. Khi trị của các thuộc tính Position của nó thay đổi, thì CurrencyManager thông tri cho tất cả các đối tượng Binding được gắn liền là phải cập nhật dữ liệu được trao qua cho những control data-bound theo những trị mới đọc được từ vị trí mới trên dữ liệu nguồn. Thuộc tính Position thuộc kiểu read/write. Do đó, bạn có thể cho Position về trước hoặc lui về sau. Muốn biết vị trí hiện hành, thì phải truy cập thuộc tính read-only Current.

- BindingContext:
+ Một đối tượng CurrencyManager sẽ hiện hữu đối với mỗi dữ liệu nguồn được dùng cho simple data binding. Như vậy, có thể có nhiều hơn một CurrencyManager cho bất cứ control nào đó, hoặc vì control được gắn liền với nhiều hơn một dữ liệu nguồn hoặc vì control là một thùng chứa đối với các control khác dùng chung nhiều dữ liệu nguồn.
Chính lúc này, đối tượng BindingContext vào cuộc để đóng gói dưới dạng một tập hợp, một hoặc nhiều đối tượng CurrencyManager. Muốn nhận một đối tượng CurrencyManager đặc biệt nào đó, đơn giản ta trao dữ liệu nguồn cho thuộc tính BindingContext. Bạn có thể đơn giản nhận được dễ dàng cùng đối tượng CurrencyManager như sau:

Mã: Chọn hết

  1. txtLastName.BindingContext[dtbProducts];


- Tạo những đối tượng Binding:
+ Một khi đã có trong tay dữ liệu nguồn, bạn có thể tiến hành việc tạo những đối tượng Binding cho mỗi control simple-bound. Muốn thế, bạn chỉ cần gọi phương thức Add() của collection DataBindings của control đó, trao qua cho tên thuộc tính của control, dữ liệu nguồn và tên của đối tượng DataColumn chứa dữ liệu hiện thời. Ví dụ:

Mã: Chọn hết

  1. txtProductID.DataBindings.Add("Text", dtbProducts, "ProductID");


- Làm việc với CurrencyManager:

Mã: Chọn hết

  1. private CurrencyManager cmProducts;
  2. cmProducts = (CurrencyManager) this.BindingContext[dtbProducts];
  3. cmProducts.PositionChanged += new EventHandler(cmProducts_PositionChanged);


+ Khi vị trí thay đổi, đối tượng CurrencyManager bật ra tình huống PositionChanged() và làm cho tất cả control data-bound được gắn liền phải cập nhật. Và tất nhiên, bạn có thể làm bất cứ gì trong phương thức được thụ lý bởi tình huống PositionChanged này như:

Mã: Chọn hết

  1. lblRecord.Text = "Record " + (cmProducts.Position + 1).ToString() + " of " + cmProducts.Count.ToString();
  2.  


Lưu ý: yêu cầu máy bạn phải có CSDL Northwind trong SQL SERVER 2005 Express
SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT


Quay về “[.NET] Mẹo vặt khác”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách