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