Visual Studio và Data Access – Phần 4

Tạo Tables và Rows

Ví dụ XSD dễ dàng hơn trong chương chỉ đoạn mã được viết ra khi visual

studio editor được dùng để tạo một tập hợp lớp truy cập dữ liệu, và bạn sẽ

được vui với đoạn mã cho các lớp này như sau:

public class CustomerTable : DataTable

{

public CustomerTable() : base("Customers")

{

this.Columns.Add("CustomerID", typeof(string));

this.Columns.Add("CompanyName", typeof(string));

this.Columns.Add("ContactName", typeof(string));

}

protected override System.Type GetRowType()

{

return typeof(CustomerRow);

}

protected override DataRow NewRowFromBuilder(DataRowBuilder

builder)

{

return(DataRow) new CustomerRow(builder);

}

}

pdf13 trang | Chuyên mục: Visual C# | Chia sẻ: dkS00TYs | Lượt xem: 1679 | Lượt tải: 2download
Tóm tắt nội dung Visual Studio và Data Access – Phần 4, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
Viewing .NET Data 
Visual Studio và Data Access – Phần 4 
Tạo Tables và Rows 
Ví dụ XSD dễ dàng hơn trong chương chỉ đoạn mã được viết ra khi visual 
studio editor được dùng để tạo một tập hợp lớp truy cập dữ liệu, và bạn sẽ 
được vui với đoạn mã cho các lớp này như sau: 
public class CustomerTable : DataTable 
{ 
 public CustomerTable() : base("Customers") 
 { 
 this.Columns.Add("CustomerID", typeof(string)); 
 this.Columns.Add("CompanyName", typeof(string)); 
 this.Columns.Add("ContactName", typeof(string)); 
 } 
 protected override System.Type GetRowType() 
 { 
 return typeof(CustomerRow); 
 } 
 protected override DataRow NewRowFromBuilder(DataRowBuilder 
builder) 
 { 
 return(DataRow) new CustomerRow(builder); 
 } 
} 
Điều cần thíêt đầu tiên của một DataTable là bạn override phương thức 
GetRowtype(). Nó được dùng bởi các đặc tính .NET khi tạo các dòng mới 
cho bảng. Bạn nên trả về kiểu của lớp dùng để mô tả mọi hàng. 
Điều cần thiết tiếp theo là bạn thực thi phương thức NewRowFromBuilder(), 
đựơc gọi lại khi tạo ra các hàng mới cho bảng. Bấy nhiêu đủ cho một sự thực 
thi nhỏ. Sự thực thi của chúng ta bao gồm thêm các cột vào DataTable. từ 
khi chúng ta biết các cột trong ví dụ này là gì, chúng ta có thể thêm chúng 
cho phù hợp. Lớp CustomerRow thì khá đơn giản. Nó thực thi các thuộc tính 
cho mọi cột trong hàng, và sau đó thực thi các phương thức để hiển thị trên 
menu ngữ cảnh: 
public class CustomerRow : ContextDataRow 
{ 
 public CustomerRow(DataRowBuilder builder) : base(builder) 
 { 
 } 
 public string CustomerID 
 { 
 get { return (string)this["CustomerID"];} 
 set { this["CustomerID"] = value;} 
 } 
 // Other properties omitted for clarity 
 [ContextMenu("Blacklist Customer")] 
 public void Blacklist() 
 { 
 // Do something 
 } 
 [ContextMenu("Get Contact",Default=true)] 
 public void GetContact() 
 { 
 // Do something else 
 } 
} 
Lớp thừa hưởng từ ContextDataRow bao gồm các phương thức getter/setter 
trên các thuộc tính được đặt tên cùng với mọi trường và sau đó một tập 
phương thức sẽ được thêm để được dùng khi phản hồi trên lớp: 
 [ContextMenu("Blacklist Customer")] 
 public void Blacklist() 
 { 
 // Do something 
 } 
Mọi phương thức mà bạn muốn hiển thị trên menu ngữ cảnh có cùng kiểu và 
bao gồm attribute ContextMenu tuỳ biến. 
Sử dụng một Attribute 
Ý tưởng sau viết attribute ContextMenu là để cung cấp một tên văn bản tự 
do cho một tuỳ chọn menu. Ta thực thi một cờ Default để cho biết sự chọn 
lựa menu mặc định. Lớp attribute được mô tả như sau: 
[AttributeUsage(AttributeTargets.Method,AllowMultiple=false,Inherited=tr
ue)] 
public class ContextMenuAttribute : System.Attribute 
{ 
 public ContextMenuAttribute(string caption) 
 { 
 Caption = caption; 
 Default = false; 
 } 
 public readonly string Caption; 
 public bool Default; 
} 
Ở đây, attribute AttributeUsage trên lớp đánh dấu ContextMenuAttrinbute 
như chỉ có thể dùng trong một phương thức, và nó cũng định nghĩa là chỉ có 
một thể hiện của đối tượng này trên bất kỳ phương thức nào. 
Bạn có thể nghĩ về một số lượng các thành viên khác để thêm vào attribute 
này như là: 
 một hotkey cho tuỳ chọn menu 
 Một hình ảnh để hiển thị 
 Vài văn bản đểhiển thị trong thanh công cụ 
 Một help context ID 
Dispatching Methods 
Khi một menu được hiển thị trong .NET, mọi tuỳ chọn menu được liên kết 
với mã xử lý. Trong quá trình thực thi cơ chế móc menu chọn đến mã, bạn 
có hai chọn lựa như sau: 
 Thực thi một phương thức với cùng dạng như System.EventHandler. 
 public delegate void EventHandler(object sender, EventArgs e); 
 Định nghĩa một lớp đại diện thực thi và gọi đến lớp nhận. Nó được 
biết như mẫu Command. 
Mẫu Command tách người gửi và người nhận của sự gọi bằng các phương 
tiện của một lớp đơn giản. Nó tạo nên các phương thức trên mọi DataRow 
đơn giản hơn, và nó có thể mở rộng hơn: 
public class MenuCommand 
{ 
 public MenuCommand(object receiver, MethodInfo method) 
 { 
 Receiver = receiver; 
 Method = method; 
 } 
 public void Execute(object sender, EventArgs e) 
 { 
 Method.Invoke(Receiver, new object[] {} ); 
 } 
 public readonly object Receiver; 
 public readonly MethodInfo Method; 
} 
Lớp cung cấp một delegate EventHandler để gọi phương thức trên đối tượng 
nhận .Ví dụ của chúng ta sử dụng hai kiểu hàng khác nhau: Hàng từ bảng 
Customer và hàng từ bảng Orders. Các tuỳ chọn xử lý cho mọi kiểu dữ liệu 
này từ giống đến khác. Hình ảnh trên trình bày các tác vụ cho một hàng 
Customer. Hình bên dưới trình bày các tuỳ chọn cho một hàng Order: 
Getting the Selected Row 
Vấn đề cuối cùng trong ví dụ này là cách để làm việc ngoài các hàng trong 
DataSet. Bạn nghĩ rằng nó là một thuộc tính trên DataGrid, nhưng bạn sẽ 
không tìm thấy nó ở đó. Bạn sẽ nhìn vào thông tin kiểm mà bạn có thể đạt 
được từ bên trong sự kiện MouseUp(), nhưng nó chỉ giúp nếu bạn đang hiển 
thị dữ liệu từ một DataTable đơn. 
Quay lại cách khung lưới được điền ngay lập tức, dòng mã để thực hiện là: 
dataGrid.SetDataBinding(ds,"Customers"); 
Phương thức này thêm một CurrencyManager mới vào BindingContext, để 
mô tả cho DataTable và DataSet. Bây giờ, DataGrid có hai thuộc tính 
DataSource và DataMember. Các thuộc tính này được cài đặt khi bạn gọi 
phương thức SetDataBinding(). DataSource trong thể hiện này sẽ là một 
DataSet và ĐataMeber sẽ là Customers. 
Chúng ta có một nguồn dữ liệu, một thành viên dữ liệu và biết thông tin này 
được lưu trữ trong BindingContext của form. 
 protected void dataGrid_MouseUp(object sender, MouseEventArgs e) 
 { 
 // Perform a hit test 
 if(e.Button == MouseButtons.Right) 
 { 
 // Find which row the user clicked on, if any 
 DataGrid.HitTestInfo hti = dataGrid.HitTest(e.X, e.Y); 
 // Check if the user hit a cell 
 if(hti.Type == DataGrid.HitTestType.Cell) 
 { 
 // Find the DataRow that corresponds to the cell 
 //the user has clicked upon 
Sau khi gọi dataGrid.HitTest() để tính nơi ngừời dùng click chuột, sau đó 
chúng ta khôi phục thể hiện BindingManagerBase cho khung dữ liệu: 
 BindingManagerBase bmb = this.BindingContext[ 
dataGrid.DataSource, 
 dataGrid.DataMember]; 
Đoạn mã trên sử dụng DataSource và DataMember của DataGrid để đặt tên 
cho đối tượng chúng ta muốn được trả về.Tất cả chúng ta muốn làm bây giờ 
là tìm hàng mà người dùng click và hiện menu ngữ cảnh. Khi nhắp phải 
chuột trên một hàng, thì hàng được chọn hiện hành không di chuyển một 
cách bình thường. Chúng ta muốn di chuyển hàng được chọn và sau đó pop 
up menu.Từ đối tượng HitTestInfo chúng ta có số hàng, vì tất cả chúng ta 
cần là di chuyển vị trí hiện tại của đối tượng BindingManagerBase : 
 bmb.Position = hti.Row; 
sự thay đổi này chỉ đến ô và tại cùng một lúc các phương tiện ta gọi vào lớp 
để lấy Row , ta kết thúc với hàng hiện hành và không chọn một cái cuối 
cùng: 
 DataRowView drv = bmb.Current as DataRowView; 
 if(drv != null) 
 { 
 ContextDataRow ctx = drv.Row as ContextDataRow; 
 if(ctx != null) ctx.PopupMenu(dataGrid,e.X,e.Y); 
 } 
 } 
 } 
 } 
Khi DataGrid đang hiển thị các item từ một DataSet, đốitượng Current bên 
trong bộ BindingManagerBase là một DataRowView, nó được kiểm tra bởi 
một bố cục rõ ràng trong đoạn mã trên. Nêu thành công ta có thể khôi phục 
hàng mà DataRowView wraps bằng cách hiện một bố cục khác để kiểm tra 
nếu nó là một ContextDataRow, và cuối cùng pop up một menu. 
Trong ví dụ, bạn chú ý ta tạo ra hai bảng dữ liệu, Customers và Orders, và 
định nghĩa một mối quan hệ giữa các bảng này, để khi bạn click trên 
CustomerOrders bạn thấy một danh sách orders. Khi bạn làm như vậy, 
DataGrid thay đổi DataMember từ Customers đến 
Customers.CustomerOrders, nó xảy ra để xác định rằng bộ chỉ mục 
BindingContext dùng để khôi phục dữ liệu đang trình bày. 

File đính kèm:

  • pdf91_3818.pdf
Tài liệu liên quan