Mini Kabibi Habibi
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports DevExpress.Xpf.Grid
Imports System.Globalization
Imports GridDemo
Imports DevExpress.Xpf.DemoBase
Imports DevExpress.Xpf.DemoBase.NWind
Imports DataView = System.Collections.Generic.List(Of DevExpress.Xpf.DemoBase.NWind.OrderDetails)
Imports DataRowView = DevExpress.Xpf.DemoBase.NWind.OrderDetails
Imports DataRow = DevExpress.Xpf.DemoBase.NWind.OrderDetails
Imports DevExpress.Xpf.Core
Imports DevExpress.Data.Browsing
Namespace GridDemo
<CodeFile("ModuleResources/ValidationClasses.(cs)")> _
Partial Public Class Validation
Inherits GridDemoModule
Private dataView As DataView
Public Sub New()
InitializeComponent()
dataView = TryCast(NWindData.OrderDetailsNew, List(Of OrderDetails))
grid.ItemsSource = dataView
AddHandler unitPriceConditionListBox.EditValueChanged, AddressOf validationComboBox_SelectionChanged
AddHandler quantityConditionListBox.EditValueChanged, AddressOf validationComboBox_SelectionChanged
AddHandler discountConditionListBox.EditValueChanged, AddressOf validationComboBox_SelectionChanged
UpdateErrors()
End Sub
Private Function GetSubTotal(ByVal row As DataRowView) As Decimal
Dim price As Object = row.UnitPrice
Dim quantity As Object = row.Quantity
Dim discount As Object = row.Discount
If price IsNot Nothing AndAlso quantity IsNot Nothing AndAlso discount IsNot Nothing Then
Return Convert.ToDecimal(price) * Convert.ToInt32(quantity) * (1 - Convert.ToDecimal(discount))
End If
Return 0
End Function
Private Sub view_ValidateRow(ByVal sender As Object, ByVal e As GridRowValidationEventArgs)
UpdateRowErrors(GetRow(CType(e.Row, DataRowView)))
Dim subTotal As Decimal = GetSubTotal(CType(e.Row, DataRowView))
If subTotal < 0 Then
e.SetError("The SubTotal value must be greater than or equal to 0.")
End If
End Sub
Private Sub colUnitPrice_Validate(ByVal sender As Object, ByVal e As GridCellValidationEventArgs)
DoValidation(e, CType(unitPriceConditionListBox.SelectedItem, ValidationRule))
End Sub
Private Sub colQuantity_Validate(ByVal sender As Object, ByVal e As GridCellValidationEventArgs)
DoValidation(e, CType(quantityConditionListBox.SelectedItem, ValidationRule))
End Sub
Private Sub colDiscount_Validate(ByVal sender As Object, ByVal e As GridCellValidationEventArgs)
DoValidation(e, CType(discountConditionListBox.SelectedItem, ValidationRule))
End Sub
Private Sub DoValidation(ByVal e As GridCellValidationEventArgs, ByVal rule As ValidationRule)
Dim result As ValidationResult = rule.Validate(e.Value, e.Culture)
If (Not result.IsValid) Then
e.SetError(result.ErrorContent)
End If
End Sub
Private Sub validationComboBox_SelectionChanged(ByVal sender As Object, ByVal e As DevExpress.Xpf.Editors.EditValueChangedEventArgs)
UpdateErrors()
End Sub
Private Sub UpdateErrors()
grid.BeginDataUpdate()
Try
For Each row As DataRow In dataView
UpdateRowErrors(row)
Next row
Finally
grid.EndDataUpdate()
End Try
End Sub
Private Sub UpdateRowErrors(ByVal row As DataRow)
UpdateColumnError(row, "UnitPrice", CType(unitPriceConditionListBox.SelectedItem, ValidationRule))
UpdateColumnError(row, "Quantity", CType(quantityConditionListBox.SelectedItem, ValidationRule))
UpdateColumnError(row, "Discount", CType(discountConditionListBox.SelectedItem, ValidationRule))
End Sub
Private Sub UpdateColumnError(ByVal row As DataRow, ByVal columnName As String, ByVal rule As ValidationRule)
Dim value As Object = TypeDescriptor.GetProperties(row)(columnName).GetValue(row)
Dim result As ValidationResult = rule.Validate(value, CultureInfo.CurrentCulture)
If result.IsValid Then
row.SetColumnError(columnName, String.Empty)
Else
row.SetColumnError(columnName, result.ErrorContent.ToString())
End If
End Sub
Private Sub view_CellUpdated(ByVal sender As Object, ByVal e As CellValueChangedEventArgs)
UpdateRowErrors(GetRow(CType(e.Row, DataRowView)))
End Sub
Private Sub view_RowCanceled(ByVal sender As Object, ByVal e As RowEventArgs)
UpdateRowErrors(GetRow(CType(e.Row, DataRowView)))
End Sub
Private Function GetRow(ByVal rowView As DataRowView) As DataRow
Return rowView
End Function
End Class
End Namespace