20 thg 8, 2009

Winform C# Part 5

Đặt vấn đề:
Giả sử ta có danh sách các Field (trường dữ liệu)
Trên Form, tại mỗi control. Ta muốn mỗi lần cho hiện lên thông tin của 1 mẫu tin trong Data Source


Hướng giải quyết:
Từ trước nay thì ta vẫn làm theo cách cổ điển. Là sẽ dùng các biến để lưu dữ liệu tại mẫu tin (record) hiện tại cho đối tượng.
Và mỗi lần di chuyển đến các record khác thì ta lại set dữ liệu vào các control.(…)

Vấn đề phát sinh:
Khi lập trình, thì khi insert hay update hoặc truyền dữ liệu qua lại giữa các class thì cách làm từ trước nay là gọi 1 câu truy vấn và truyền một “lô” các parameter hay là xử lý chuỗi truy vấn rất phức tạp và rắc rối.

Giải pháp
Nếu có khả năng cao hơn thì dùng DataSet. Nhưng trước insert hay update dữ liệu thì phải lấy dữ liệu từ các control đổ vào dataset.

Để giải quyết cho những vướn mắc trên thì trong C# đã đề xuất một hướng đi rất hay và rất tiện dụng, nó đã giải quyết cho lập trình viên rất nhiều thao tác cũng như những xử lý phức tạp kéo theo khác.
Cách giải quyết đó là dùng “kỹ thuật Binding” để kết nối dữ liệu từ data source vào các control trên form. Nhằm hạn chế các thao tác xử lý nêu trên.
Trong C# nó được định nghĩa là Data Binding

Giới Thiệu về Data Binding
- Data Binding là 1 giải pháp cho người phát triển phần mềm, dùng để giải quyết các vấn đề liên quan đến dữ liệu và bề mặt giao diện (GUI) của ứng dụng.
-Data Binding là cách sắp đặt (gắn kết) các thành phần của một data source vào một thành phần GUI và tự động làm việc với dữ liệu. Ta có thể bind một cột (column) vào một TextBox qua thuộc tính Text hoặc có thể bind cả một table vào DataGrid như DataGridView.

Có 2 cách bind dữ liệu vào Windows Forms:
Simple Data Binding – gắn kết dữ liệu đơn giản.
Complex Data Binding – gắn kết dữ liệu phức tạp.

Simple Data Binding là cách gắn kết một - một giữa một thuộc tính của control và một thành phần của data source, và sử dụng control này để hiển thị duy nhất một giá trị một lần.
Ví dụ: gắn kết dữ liệu từ một cột của một table vào thuộc tính Text của một TextBox nào đó trên Form.

Complex Data Binding là gắn kết một control với một hoặc nhiều thành phần data của data source, có thể hiển thị nhiều hơn một giá trị một lần.
Ví dụ: gắn kết dữ liệu từ một table với một ComboBox hay gắn kết dữ liệu từ một table với một dataGridView

Ý nghĩa to lớn của DataBinding
Với Data Binding chúng ta sẽ chỉ set dữ liệu một lần vào các control, và khi dữ liệu trên các control thay đổi thì tại các control khác dữ liệu sẽ được tự động update cho đúng với mẫu tin (record) trong data source.
Data Binding cũng sẽ tự động update những dữ liệu mà chúng ta đã thay đổi tại các control trong quá trình thao tác trên ứng dụng.
Ngoài ra Data Binding còn giúp chúng ta quản lý lỗi dữ liệu tốt hơn. Đồng thời nó cũng tự động định dạng dữ liệu theo đúng dịnh dạng chúng ta sử dụng trên các control.
Chính vì thế Data Binding ra đời nhằm gói gọn tất cả các thao tác xử lý, nó giúp chúng ta trình bày dữ liệu một cách nhanh chóng, nó hạn chế việc viết code.

Mình xin hướng dẫn việc kết nối DataBinding vói textbook tuần nay rãnh mình sẽ viết với combox và listbook

Các bước chuân bị:
1.Chuẩn bị một table,có thể dùng MS Asscess cho tiện,ví dụ này mình dùng asscess
2.Sử dụng Kỹ thuật Binding

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data.OleDb;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//
//khoi tao table cho dtbSinhVien
//
private DataTable DtbSinhvien = new DataTable();
private CurrencyManager cmdSinhVien;
OleDbDataAdapter dadSinhvien;
//
//Form1_Load
//
private void Form1_Load(object sender, EventArgs e)
{
try
{ //khoi tao connect
string connString = "Provider = Microsoft.Jet.OleDb.4.0; Data Source=data.mdb";
OleDbConnection conn = new OleDbConnection(connString);
//lay tong tin tu table
string selectCmd = "SELECT * FROM SinhVien";
dadSinhvien = new OleDbDataAdapter(selectCmd, conn);
//fill cho DtbSinhVien
dadSinhvien.Fill(DtbSinhvien);
BuildDataBinding();
conn.Close();
}
catch (OleDbException ex)
{
MessageBox.Show(ex.Message);
}
}
//
//BuildDataBinding();
//
private void BuildDataBinding()
{
TB_MSSV.DataBindings.Add("Text", DtbSinhvien, "MSSV");
TB_HoTen.DataBindings.Add("Text", DtbSinhvien, "HoTen");
TB_NgaySinh.DataBindings.Add("Text", DtbSinhvien, "NgaySinh");
TB_Khoa.DataBindings.Add("Text", DtbSinhvien, "Khoa");
TB_NienKhoa.DataBindings.Add("Text", DtbSinhvien, "NienKhoa");
TB_DiemTrungBinh.DataBindings.Add("Text", DtbSinhvien, "DiemTrungBinh");
TB_XepLoai.DataBindings.Add("Text", DtbSinhvien, "XepLoai");
//
//su dung BindingContext,muc dich la de giai quyet van de nhieu CurrencyManager
//
cmdSinhVien = (CurrencyManager)this.BindingContext[DtbSinhvien];
//
//tao thuoc tinh cho PositionChanged bien cmdSinhVien
//
cmdSinhVien.PositionChanged += new EventHandler(cmdSinhVien_PositionChanged);

}
//
//ham cmdSinhVien_PositionChanged
//
private void cmdSinhVien_PositionChanged(object sender, EventArgs e)
{
Label_Thongtin.Text = "Sinh Vien thu " + (cmdSinhVien.Position + 1).ToString() + " trong tong so " + cmdSinhVien.Count.ToString() + " Sinh Vien";
}
//
//code cho cac button frist,next,last,pre
//
private void BT_Frist_Click(object sender, EventArgs e)
{
cmdSinhVien.Position=0;
}

private void BT_Last_Click(object sender, EventArgs e)
{
cmdSinhVien.Position = cmdSinhVien.Count - 1;
}

private void BT_Previous_Click(object sender, EventArgs e)
{
cmdSinhVien.Position--;
}

private void BT_Next_Click(object sender, EventArgs e)
{
cmdSinhVien.Position++;
}

}
}

Kết quả: Bạn có thể xem thông tin các sinh viên qua CSDL mình vừa tạo ra

Một số vấn đề liên quan:
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 dùng thao tác qua lại trên các mẫu tin.
Trong các dữ liệu nguồn .NET, kể các DataSet, cũng không có khái niệm về mẫu tin hiện hành. Bởi vậy nên thay vào đó, đối tượng CurrencyManager sẽ hỗ trợ chúng ta làm việc này một cách dễ dàng.
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 đó.
Đối tượng CurrencyManager có một thuộc tính quan trọng đó là Position. Thuộc tính Position này nó sẽ cho ta biết vị trí (index) của mẫu tin hiện thời đang được hiển thị trên các control.
Do đó chúng ta có thể đi đến mẫu tin kế tiếp hoặc lùi về mẫu tin trước một cách khá dễ dàng và thuận tiện.
BindingContext:
Một đối tượng CurrencyManager sẽ hiện hữu đối với mỗi Data Source đượ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 Data Source, hoặc vì control là một thùng chứa đối với các control khác dùng chung nhiều Data Source.
Lúc này 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:

Vài bữa mình sẽ trình bày thêm vấn đề update,insert,delete CSDL!Thân chào

Không có nhận xét nào:

Đăng nhận xét