Dùng Dataview để Filter và Sort

Một phần của tài liệu Giáo trình Lập trình mạng nâng cao hướng.NET (Nghề Lập trình máy tính): Phần 2 - Tổng cục dạy nghề (Trang 62 - 64)

Thường thường, khi điều khiển trong thời gian thật (real-time control), là Operator, ta muốn các alarms có ưu tiên cao và mới xãy ra nhất được hiển thị trên hết. Đôi khi, ta chỉ muốn thấy các alarm priority 3 (ưu tiên cao nhất) mà thôi. Để thực hiện các việc nầy, ta dùng Dataview Object. Thay vì dùng thẳng table alarm của DataSet alarmlist làm datasource của DataGrid1, ta sẽ dùng một DataView derived from (đến từ) table alarm. Ta có thể Sort (sắp theo thứ tự) các alarms/records theo Priority hay áp dụng Filter (sàn lọc) vào DataView để chỉ thấy những thứ gì mình muốn, thí dụ chỉ có alarms priority 3 thơi.

Nên nhớ là nằm đàng sau vẫn là table alarm, nhưng Dataview đóng vai trị cặp kiếng mát màu giúp cho ta thấy những thứ gì và theo cách ta muốn. Mỗi khi ta thay một cặp kiếng, ta lại thấy những thứ khác.

Dưới đây là Sub BtnLoadXMLData_Click được sửa lại một chút để dùng DataView:

Private Sub BtnLoadXMLData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

Handles BtnLoadXMLData.Click ' Instantiate a DataSet type alarmlist

DS = New alarmlist()

' Load the XML data from file AlarmList.xml in the source code folder. Note that the program EXE resides

' in the bin subfolder

DS.ReadXml("../AlarmList.xml")

' Bind the Datagrid DataSource to this new DataSet table alarm ' DataGrid1.DataSource = DS.alarm

' Create a Dataview from DS

DV1 = New System.Data.DataView(DS.alarm) ' Sort alarms by priority, then datetime

' DESC stands for descending order,i.e. biggest on top DV1.Sort = "priority DESC, datetime DESC"

' Bind the Datagrid DataSource to Dataview DataGrid1.DataSource = DV1

AddCustomDataTableStyle()

' Display the number of alarms in each priority DisplayTotal()

End Sub

Để ý Dataview object DV1 được derived từ DS.alarm. Sau đó ta Sort các alarms theo thứ tự ưu tiên, rồi trong số những alarm có cùng priority ta lại Sort chúng theo datetime (ở đây data type của datetime chỉ là string).

Ngoài ra để đếm con số các alarms thuộc mỗi priority ta có thể dùng Dataview với filter rồi xem

property Count của nó như sau:

Private Sub DisplayTotal()

' Create a Dataview object from table DS.alarm

Dim DVP1 As New System.Data.DataView(DS.alarm) ' Apply filter

DVP1.RowFilter = "priority = 1"

' Display Count of records in this Dataview

NumPrio1.Text = "Prio1: " & DVP1.Count.ToString Dim DVP2 As New System.Data.DataView(DS.alarm) DVP2.RowFilter = "priority = 2"

NumPrio2.Text = "Prio2: " & DVP2.Count.ToString Dim DVP3 As New System.Data.DataView(DS.alarm) DVP3.RowFilter = "priority = 3"

NumPrio3.Text = "Prio3: " & DVP3.Count.ToString

NumTotal.Text = "Total: " & DS.alarm.Rows.Count.ToString

Dim bmb As BindingManagerBase = Me.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember)

NumDisplayed.Text = "Displayed: " & bmb.Count.ToString End Sub

Chắc bạn đã để ý thấy thay vì iterate qua mỗi record để đếm con số alarms thuộc priority 1,2 hay 3, ta đã dùng ba Dataviews để filter ra alarms thuộc ba priorities khác nhau rồi lấy trị số Count của mỗi Dataview. Đây là lối lập trình dựa vào những gì có sẵn càng nhiều càng tốt để tránh tạo ra bugs.

Ngoài ra, để đếm con số hàng alarms được thật sự hiển thị bất cứ lúc nào ta dùng

Dim bmb As BindingManagerBase = Me.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember)

NumDisplayed.Text = "Displayed: " & bmb.Count.ToString

Một phần của tài liệu Giáo trình Lập trình mạng nâng cao hướng.NET (Nghề Lập trình máy tính): Phần 2 - Tổng cục dạy nghề (Trang 62 - 64)

Tải bản đầy đủ (PDF)

(157 trang)