Imports DevExpress.XtraGrid.Columns Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraVerticalGrid.Rows Imports ImporterShared.Documents Imports ImporterShared.DocumentRow Imports DevExpress.XtraEditors.Repository Imports ImporterShared.Winline Imports DigitalData.Modules.Language Imports DevExpress.XtraEditors.Controls Imports System.Globalization Imports DevExpress.XtraEditors Public Class frmRowEditor Private ReadOnly _Columns As List(Of String) Private ReadOnly _DataTable As New DataTable Private ReadOnly _Accounts As List(Of Account) Private ReadOnly _DocumentRow As ImporterShared.DocumentRow Private ReadOnly DatePicker As New RepositoryItemDateEdit Private ReadOnly MultilineEditor As New RepositoryItemMemoEdit Private ReadOnly AccountPicker As New RepositoryItemSearchLookUpEdit Private ReadOnly MaskDateEditor As New RepositoryItemTextEdit Private Const COL_KEY = "KEY" Private Const COL_VALUE_ORIGINAL = "VALUE_ORIGINAL" Private Const COL_VALUE_EXTERNAL = "VALUE_EXTERNAL" Private Const COL_VALUE_FINAL = "VALUE_FINAL" Public ReadOnly Property DocumentRow As ImporterShared.DocumentRow Get Return _DocumentRow End Get End Property Public Sub New(pColumns As List(Of String), pDocumentRow As ImporterShared.DocumentRow, pAccounts As List(Of Account)) ' Dieser Aufruf ist für den Designer erforderlich. InitializeComponent() ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. _Columns = pColumns _Accounts = pAccounts _DocumentRow = pDocumentRow AccountPicker.DataSource = _Accounts AccountPicker.DisplayMember = "Name" AccountPicker.ValueMember = "Id" 'DatePicker.CalendarTimeEditing = DevExpress.Utils.DefaultBoolean.False 'DatePicker.EditMask = "yyyy-MM-dd" 'DatePicker.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.DateTimeAdvancingCaret 'DatePicker.DisplayFormat.FormatString = "yyyy-MM-dd" ' DatePicker.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime 'DatePicker.DisplayFormat.FormatString = "d" 'DatePicker.EditFormat.FormatString = "yyyy-MM-dd" 'DatePicker.EditFormat.FormatType = DevExpress.Utils.FormatType.DateTime 'DatePicker.EditFormat.FormatString = "d" 'DatePicker.Mask.UseMaskAsDisplayFormat = True 'DatePicker.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.DateTime ' DatePicker.Mask.EditMask = "yyyy-MM-dd" 'AddHandler DatePicker.ParseEditValue, AddressOf DatePicker_ParseEditValue 'MaskDateEditor.Mask.EditMask = "yyyy-MM-dd" 'MaskDateEditor.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Simple End Sub Private Sub DatePicker_ParseEditValue(sender As Object, e As ConvertEditValueEventArgs) If TypeOf sender Is RepositoryItemDateEdit Then Debug.WriteLine($"RepoItem # {e.Value} # {e.Value.GetType.Name}") ElseIf TypeOf sender Is DateEdit Then Debug.WriteLine($"DateEdit # {e.Value} # {e.Value.GetType.Name}") End If End Sub Private Sub frmRowEditor_Load(sender As Object, e As EventArgs) Handles Me.Load Dim oDict = New Dictionary(Of String, FieldValue) For Each oColumn As String In _Columns Dim oField = _DocumentRow.Fields. Where(Function(f) f.Key = oColumn). SingleOrDefault() If oField.Value Is Nothing Then oDict.Add(oColumn, New FieldValue()) Else oDict.Add(oColumn, oField.Value) End If Next _DataTable.Columns.Clear() _DataTable.Columns.Add(COL_KEY) _DataTable.Columns.Add(COL_VALUE_ORIGINAL) _DataTable.Columns.Add(COL_VALUE_EXTERNAL) _DataTable.Columns.Add(COL_VALUE_FINAL) For Each oKV In oDict _DataTable.Rows.Add(oKV.Key, oKV.Value.Original, oKV.Value.External, oKV.Value.Final) Next GridControl1.DataSource = _DataTable End Sub Private Sub btnSave_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnSave.ItemClick GridView1.CloseEditor() For Each oRow As DataRow In _DataTable.Rows Dim oField = _DocumentRow.Fields. Where(Function(f) f.Key = oRow.Item(COL_KEY)). SingleOrDefault() If oField.Key Is Nothing Then oField = New KeyValuePair(Of String, FieldValue)(oRow.Item(COL_KEY), New FieldValue()) End If Dim oFieldValue As FieldValue = oField.Value Dim oGridValue As String = Utils.NotNull(oRow.Item(COL_VALUE_FINAL), String.Empty) If oField.Key = "Datum_Auftrag-Bestellung" And oGridValue.Length > 0 Then If TryParseDate(oGridValue) Is Nothing Then MsgBox($"Datumswert für '{oField.Key}' enthält einen ungüligen Wert. Bitte benutzen Sie das Format 'YYYY-MM-DD'.", MsgBoxStyle.Exclamation, Text) Exit Sub End If End If If Not oFieldValue.Final.Equals(oGridValue) Then oFieldValue.Final = Utils.NotNull(oRow.Item(COL_VALUE_FINAL), String.Empty) If _DocumentRow.Fields.ContainsKey(oField.Key) Then _DocumentRow.Fields.Item(oField.Key) = oFieldValue Else _DocumentRow.Fields.Add(oField.Key, oFieldValue) End If End If Next DialogResult = DialogResult.OK Close() End Sub Private Function TryParseDate(pValue As String) Try Return Date.ParseExact(pValue, "yyyy-MM-dd", CultureInfo.InvariantCulture) Catch ex As Exception Return Nothing End Try End Function Private Sub btnApplyFromWinline_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnApplyFromWinline.ItemClick CopyValueToFinalColumn(COL_VALUE_EXTERNAL) End Sub Private Sub btnApplyFromOriginal_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btnApplyFromOriginal.ItemClick CopyValueToFinalColumn(COL_VALUE_ORIGINAL) End Sub Private Sub CopyValueToFinalColumn(pSourceColumnName As String) Dim oSelectedRow As DataRow = GridView1.GetDataRow(GridView1.FocusedRowHandle) If oSelectedRow Is Nothing Then Exit Sub End If oSelectedRow.Item(COL_VALUE_FINAL) = oSelectedRow.Item(pSourceColumnName) oSelectedRow.AcceptChanges() GridView1.CloseEditor() End Sub Private Sub GridView1_CustomRowCellEdit(sender As Object, e As CustomRowCellEditEventArgs) Handles GridView1.CustomRowCellEdit Dim oDataRow As DataRow = GridView1.GetDataRow(e.RowHandle) If e.Column.FieldName = COL_VALUE_ORIGINAL Or e.Column.FieldName = COL_VALUE_FINAL Then If oDataRow.Item(COL_KEY) = "Datum_Auftrag-Bestellung" Then 'e.RepositoryItem = DatePicker 'e.RepositoryItem = MaskDateEditor ElseIf e.CellValue.ToString.Length > 100 Then e.RepositoryItem = MultilineEditor ElseIf oDataRow.Item(COL_KEY) = "Fakt_Kontonummer" Or oDataRow.Item(COL_KEY) = "Lief_Kontonummer" Then e.RepositoryItem = AccountPicker End If End If End Sub End Class