Làm việc với một Row trong DataGrid

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 65 - 67)

Khi một alarm mới được báo cáo và hiển thị, hệ thống điều khiển real-time thường hay phát ra những tiếng Beep nho nhỏ để nhắc Operator xử lý sự cố tạo ra alarm. Việc đầu tiên Operator sẽ làm là Acknowledge (xác nhận là tơi biết rồi, khổ lắm, nói mãi!) cái alarm bằng cách right click lên Row hiển thị alarm rồi click menuCommand Acknowledge từ PopupMenu.

Khi bạn đã Acknowledge một alarm rồi thì cái ACKN checkbox sẽ được đánh dấu và nếu hệ thống khơng cịn alarm nào chưa được acknowledged thì nó sẽ ngừng Beep. Ngồi ra, có khi vì bạn biết là lý do gây ra một alarm nào đó khơng quan trọng (thí dụ nhân viên kỹ thuật đang sửa và thử cái sensor của alarm ấy) và bạn không muốn alarm ấy được báo cáo trong tương lai, bạn có thể Isolate (cơ lập hóa) nó. Khi nào muốn cho nó hoạt động bình thường trở lại, bạn sẽ

Enable (tác động) nó.

Bây giờ bạn hãy đặt một ContextMenu control vào form và Edit cho nó ba menuCommands tên

mnuAckn(Acknowledge), mnuIsolate(Isolate) và mnuEnable(Enable) như trong hình dưới

Mỗi khi user right click lên một hàng alarm, ContextMenu1 sẽ hiển thị chỉ những menuCommands thích hợp với tình huống. Tức là nếu alarm chưa được acknowledged thì mới có menuCommand Acknowledge, khi alarm chưa bị isolated thì mới có menuCommand Isolate, nếu đã bị isolated rồi thì chỉ có MenuCommand Enable.

Bình thường, nếu bạn click lên một checkbox còn trống trong DataGrid1, checkbox ấy sẽ được đánh dấu. Nhưng trong chương trình của chúng ta tại đây ta khơng muốn cho user làm việc ấy mà phải Acknowlege, Isolate hay Enable bằng PopupMenu. Do đó bạn hãy cho property

ReadOnly của DataGrid1 bằng True.

Lúc chương trình nhận được Event MouseDown từ DataGrid1 ta sẽ tìm cách xác định lúc bấy giờ Mouse đang nằm trên alarm line nào bằng cách chạy Method HitTest của DataGrid1. Khi DataGrid1 HitTest vị trí của Mouse với instruction myGrid.HitTest(e.X, e.Y), nó sẽ cho ta một Object HitTestInfo. Property Row của HitTestInfo là hàng thứ mấy trong DataGrid1.

Để lấy ra đúng DataRowView nào đang hiển thị ở HitTestInfo.Row ấy ta phải dựa vào

BindingManagerBase. Cái DataRowView mà ta đang tìm chính là DataRowView của

BindingManagerBase với position bằng HitTestInfo.Row ấy.

Trong chương trình nầy, ta sẽ chứa DataRowView ấy trong variable drv. Dưới đây là code để xử lý Event MouseDown của DataGrid1, để ý là ta hiển thị bên dưới cái description của alarm được clicked bằng statement Label1.Text = drv("description") để cho user một feedback:

' Variable used to store selected DataRowView Dim drv As DataRowView

Private Sub DataGrid1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _

Handles DataGrid1.MouseDown ' Only proceed when Mouse Right Button was clicked

If e.Button <> MouseButtons.Right Then Exit Sub

' Typecast sender to DataGrid data type. myGrid is actually DataGrid1 Dim myGrid As DataGrid = CType(sender, DataGrid)

' Declare a HitTestInfo variable Dim hti As DataGrid.HitTestInfo ' Obtain the info about Mouse location hti = myGrid.HitTest(e.X, e.Y)

' Only proceed when a Cell was hit

If hti.Type = DataGrid.HitTestType.Cell Then Try

' Obtain BindingManagerBase of DataGrid1

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

' Position at DataRowView corresponding to the physical row that was hit bmb.Position = hti.Row

' Store the found DataRowView in temporary variable drv drv = bmb.Current

' Display description of the alarm line as a feedback Label1.Text = drv("description")

If Not (drv Is Nothing) Then

' Only display the MenuCommands that are appropriate to this context Dim ctx As DataRow = drv.Row

If Not (ctx Is Nothing) Then If drv("ackn") = True Then mnuAckn.Visible = False Else

' Only display menuCommand Ackn when alarm is not yet acknowledged mnuAckn.Visible = True

End If

If drv("isolate") = True Then

' If alarm is already isolated then only display MenuCommand Enable mnuIsolate.Visible = False mnuEnable.Visible = True Else mnuIsolate.Visible = True mnuEnable.Visible = False End If

' Popup context menu

ContextMenu1.Show(myGrid, New Point(e.X, e.Y)) End If End If Catch ex As Exception MessageBox.Show(ex.ToString()) End Try End If End Sub

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 65 - 67)

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

(157 trang)