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 ReadOnly ReadOnlyEditor 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" ReadOnlyEditor.ReadOnly = True '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 If e.Column.FieldName = COL_VALUE_FINAL Then Dim oReadOnlyFields As New List(Of String) From { "BELEGKEY" } If oReadOnlyFields.Contains(oDataRow.Item(COL_KEY)) Then e.RepositoryItem = ReadOnlyEditor End If End If End Sub Private Sub GridView1_CustomDrawCell(sender As Object, e As DevExpress.XtraGrid.Views.Base.RowCellCustomDrawEventArgs) Handles GridView1.CustomDrawCell Dim oDataRow As DataRow = GridView1.GetDataRow(e.RowHandle) If e.Column.FieldName = COL_VALUE_FINAL Then Dim oReadOnlyFields As New List(Of String) From { "BELEGKEY" } If oReadOnlyFields.Contains(oDataRow.Item(COL_KEY)) Then e.Appearance.BackColor = Color.LightGray End If End If End Sub End Class