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 System.Data
Imports System.Windows.Controls
Namespace GridDemo
<CodeFile("ModuleResources/ValidationClasses.(cs)")> _
Partial Public Class Validation
Inherits GridDemoModule
Private dataView As DataView
Public Sub New()
InitializeComponent()
dataView = NWindData.OrderDetailsNew
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.Table.Rows
row.BeginEdit()
UpdateRowErrors(row)
row.EndEdit()
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 = row(columnName)
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.Row
End Function
End Class
End Namespace