Tuan13 c net databinding

15 0 0
Tuan13 c net databinding

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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[.]

11/28/2018 Lập trình Ứng dụng quản lý C#.NET Kỹ thuật xây dựng ứng dụng quản lý Nội dung  Data Binding 11/28/2018 Nội dung  Data Binding Cơ Data Binding  Phần lớn ứng dụng Winform cung cấp cho người dùng cách thức hiệu để làm việc với liệu Các liệu mà người dùng sử dụng nằm nhiều kho liệu, thông dụng database hệ thống tập tin Có nhiều kỹ thuật tương đương để trình bày liệu ADO.NET, native data access APIs, custom objects chí web service  Chức ứng dụng Winform để tương tác với nguồn liệu để đọc liệu, hiển thị nó, cung cấp cách thức để chỉnh sửa ghi thay đổi data store 11/28/2018  Với nhiều data store data access API, Winform đơn giản hóa xử lý với khái niệm data source Sự trừu tượng hóa cho phép Winform xử lý data store công nghệ truy cập khác cách quán  Data source tảng kỹ thuật hiệu với mục đích đơn giản hóa việc tích hợp ứng dụng Winform với liệu Công nghệ gọi Data Binding  Về logic, data binding liên kết object properties với control properties hỗ trợ data binding engine Mô hình 11/28/2018 Minh họa  Xét đối tượng RaceCarDriver class RaceCarDriver { string _name; int _wins; public string Name { get => _name; set => _name = value; } public int Wins { get => _wins; set => _wins = value; } }  Hiển thị liệu 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(); } } 11/28/2018  Cập nhật liệu sửa đổi 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); }  Thay đổi liệu 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(); }  Nếu tự thân liệu thay đổi không qua tác động thành phần hiển thị tại? 11/28/2018 INotifyPropertyChanged  Thuộc namespace System.ComponentModel, INotifyPropertyChanged có thành viên 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)); } }  Xử lý 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; } } 11/28/2018 Quy trình xử lý 11/28/2018 Winform Data Binding  Binding object var nameBinding = new Binding("Text", raceCarDriver, "Name", true); txtName.DataBindings.Add(nameBinding); var winsBinding = new Binding("Text", raceCarDriver, "Wins", true); txtWins.DataBindings.Add(winsBinding);  Hầu hết control property ràng buộc (bind) theo cách giữ đồng với public property object  Một binding two-way object kích hoạt INotifyPropertyChanged.PropertyChanged public property read-write List Data Source IList raceCarDrivers = new List { 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"); 11/28/2018 Navigation  Sử dụng BindingManager BindingManagerBase 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; } 11/28/2018 Complex Binding  Complex Binding ràng buộc control property với list data source dgv.DataSource = raceCarDrivers;  Thay đổi liệu 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); }  Chưa cập nhật cho phần hiển thị! 10 11/28/2018 Chức cần có binding list data source  Mức độ tối thiểu chức ràng buộc liệu sử dụng cho list data source thực cần bao gồm tất yếu tố sau  Hỗ trợ cho mơ hình simple complex binding  Khả thêm, cập nhật xóa item control hiển thị ràng buộc list data source  Việc đưa thông báo thay đổi danh sách item danh sách  Chức chức liên quan khác đóng gói interface ràng buộc liệu IBindingList IBindingList  IBindingList mở rộng IList với chức ràng buộc liệu cụ thể cho list data source  Nếu thông báo thay đổi danh sách hỗ trợ, control bị ràng buộc gắn kết vào event ListChanged để xử lý item thêm vào, cập nhật xoá giữ liệu hiển thị đồng với nguồn liệu danh sách  BindingList class triển khai IBindingList 11 11/28/2018 BindingList  Thuộc namespace System.ComponentModel, generic implementation IBindingList BindingList raceCarDrivers = new BindingList { 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++; } 12 11/28/2018 BindingSource  Sử dụng để đóng gói IList có sẵn thành IBindingList 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); 13 11/28/2018 private 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); } } 14 11/28/2018 Master-Detail Forms Bài tập  Với liệu Northwind xây dựng ứng dụng đơn giản minh họa Master-Detail form [sử dụng Category Product] (cho phép duyệt, thêm, xóa, sửa có áp dụng data binding) 15

Ngày đăng: 09/04/2023, 06:29

Tài liệu cùng người dùng

Tài liệu liên quan