Lập trình Windows 11/28/2018 1 C# NET Kỹ thuật xây dựng ứng dụng quản lý Lập trình Ứng dụng quản lý Nội dung Data Binding 11/28/2018 2 Nội dung Data Binding Cơ bản Data Binding Phần lớn các ứng[.]
Trang 1Kỹ thuật xây dựng ứng dụng quản lý
Lập trình Ứng dụng quản lý
Nội dung
Trang 2Nội dung
Data Binding
Cơ bản Data Binding
người dùng cách thức hiệu quả để làm việc với
dữ liệu Các dữ liệu mà người dùng sử dụng nằm
ở rất nhiều kho dữ liệu, thông dụng là các
thuật tương đương để trình bày dữ liệu như
ADO.NET, native data access APIs, custom
tác với các nguồn dữ liệu này để đọc dữ liệu,
hiển thị nó, cung cấp cách thức để chỉnh sửa và
Trang 3 Với rất nhiều data store và các data access API,
truy cập khác nhau một cách duy nhất và nhất
quán
hiệu quả với mục đích duy nhất là đơn giản hóa
việc tích hợp các ứng dụng Winform với dữ liệu
Công nghệ này được gọi là Data Binding.
bởi data binding engine.
Mô hình
Trang 4Minh họa
class RaceCarDriver
{
string _name;
int _wins;
public string Name
{
get => _name; set => _name = value;
}
public int Wins
{
get => _wins; set => _wins = value;
}
}
public partial class frmRaceCar : Form
{
RaceCarDriver raceCarDriver = new RaceCarDriver {
Name = "M Schumacher" , Wins = 500 };
public frmRaceCar()
{
InitializeComponent();
txtName.Text = raceCarDriver.Name;
txtWins.Text = raceCarDriver.Wins.ToString();
}
}
Trang 5 Cập nhật dữ liệu khi sửa đổi trên form
txtName.TextChanged += TxtName_TextChanged;
txtWins.TextChanged += TxtWins_TextChanged;
private void TxtName_TextChanged(object sender, EventArgs e)
{
raceCarDriver.Name = txtName.Text;
}
private void TxtWins_TextChanged(object sender, EventArgs e)
{
raceCarDriver.Wins = int.Parse(txtWins.Text);
}
động của thành phần hiển thị hiện tại?
btnAddWin.Click += BtnAddWin_Click;
private void BtnAddWin_Click(object sender, EventArgs e)
{
raceCarDriver.Wins++;
// cập nhật hiển thị
txtWins.Text = raceCarDriver.Wins.ToString();
}
Trang 6INotifyPropertyChanged chỉ có duy nhất một
thành viên là event mang tên PropertyChanged.
class RaceCarDriver : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
string _name;
int _wins;
public string Name
{
get => _name;
set {
_name = value;
OnPropertyChanged( "Name" );
}
}
……
void OnPropertyChanged( string propertyName)
{
PropertyChanged?.Invoke( this ,
new PropertyChangedEventArgs(propertyName));
}
}
raceCarDriver.PropertyChanged += RaceCarDriver_PropertyChanged;
private void RaceCarDriver_PropertyChanged( object sender,
PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "Name" :
txtName.Text = raceCarDriver.Name;
break ;
case "Wins" :
txtWins.Text = raceCarDriver.Wins.ToString();
break ;
}
Trang 7Quy trình xử lý
Trang 8Winform Data Binding
buộc (bind) theo cách này và được giữ đồng bộ
với public property của bất kỳ object nào.
INotifyPropertyChanged.PropertyChanged và
nếu public property là read-write
var nameBinding = new Binding( "Text" , raceCarDriver,
"Name" , true);
txtName.DataBindings.Add(nameBinding);
var winsBinding = new Binding( "Text" , raceCarDriver,
"Wins" , true);
txtWins.DataBindings.Add(winsBinding);
List Data Source
IList<RaceCarDriver> raceCarDrivers = new
List<RaceCarDriver> {
new RaceCarDriver{ Name = "M Schumacher" , Wins = 500 },
new RaceCarDriver{ Name = "A Senna" , Wins = 700 },
new RaceCarDriver{ Name = "A Prost" , Wins = 320 },
};
txtName.DataBindings.Add( "Text" , raceCarDrivers, "Name" );
txtWins.DataBindings.Add( "Text" , raceCarDrivers, "Wins" );
Trang 9BindingManagerBase BindingManager
{
get { return BindingContext[raceCarDrivers]; }
}
private void BtnPrev_Click( object sender, EventArgs e)
{
BindingManager.Position ;
}
private void BtnNext_Click( object sender, EventArgs e)
{
BindingManager.Position++;
}
private void BtnLast_Click( object sender, EventArgs e)
{
BindingManager.Position = BindingManager.Count - 1;
}
private void BtnFirst_Click( object sender, EventArgs e)
{
BindingManager.Position = 0;
}
Trang 10Complex Binding
1 list data source
dgv.DataSource = raceCarDrivers;
private void BtnAdd_Click( object sender, EventArgs e)
{
raceCarDrivers.Add( new RaceCarDriver {
Name = "Nelson Piquet" , Wins = 300
});
}
private void BtnDel_Click( object sender, EventArgs e)
{
raceCarDrivers.Remove((RaceCarDriver)BindingManager.Current);
}
Trang 11Chức năng cần có của binding list data source
bao gồm tất cả các yếu tố sau
Hỗ trợ cho cả 2 mô hình simplevà complex binding
Khả năng thêm, cập nhật và xóa các itemtrên cả
control hiển thị được ràng buộc và list data source
Việc đưa ra các thông báo thay đổi danh sách và
các itemtrong danh sách
IBindingList
IBindingList
IBindingList là mở rộng của IList với chức năng
các control bị ràng buộc có thể gắn kết vào event
ListChangedđể xử lý khi các item được thêm
vào, cập nhật hoặc xoá và do đó giữ dữ liệu
được hiển thị đồng bộ với nguồn dữ liệu danh
sách
BindingList<T>là classtriển khai IBindingList
Trang 121 generic implementation của IBindingList
BindingList<RaceCarDriver> raceCarDrivers = new
BindingList<RaceCarDriver> {
new RaceCarDriver{ Name = "M Schumacher" , Wins = 500 },
new RaceCarDriver{ Name = "A Senna" , Wins = 700 },
new RaceCarDriver{ Name = "A Prost" , Wins = 320 },
};
private void BtnAddWin_Click(object sender, EventArgs e)
{
int iCurrent = BindingManager.Position;
raceCarDrivers[iCurrent].Wins++;
}
Trang 13IBindingList
BindingSource raceCarDriverBS = new BindingSource();
raceCarDriverBS.DataSource = raceCarDrivers;
dgv.DataSource = raceCarDriverBS;
txtName.DataBindings.Add( "Text" , raceCarDriverBS, "Name" );
txtWins.DataBindings.Add( "Text" , raceCarDriverBS, "Wins" );
BindingManagerBase BindingManager
{
//get { return BindingContext[raceCarDrivers]; }
get { return BindingContext[raceCarDriverBS]; }
}
Formatting bound data
var winsBinding = new Binding( "Text" , raceCarDriverBS,
"Wins" );
winsBinding.Format += WinsBinding_Format;
winsBinding.Parse += WinsBinding_Parse;
txtWins.DataBindings.Add(winsBinding);
Trang 14private void WinsBinding_Format( object sender, ConvertEventArgs e)
{
if (e.DesiredType == typeof ( string ))
{
var wins = ( int )e.Value;
e.Value = string Format( "finished {0} rounds" , wins);
}
}
private void WinsBinding_Parse( object sender, ConvertEventArgs e)
{
if (e.DesiredType == typeof ( int ))
{
var str = e.Value as string ;
str = str.Replace( "finished " , "" );
str = str.Replace( " rounds" , "" );
e.Value = int Parse(str);
}
}
Trang 15Master-Detail Forms
Bài tập
đơn giản minh họa Master-Detail form [sử dụng
Category và Product] (cho phép duyệt, thêm, xóa,
sửa và có áp dụng data binding)