Zu testen bei ewa
This commit is contained in:
@@ -274,11 +274,20 @@ Public Class ClassDocGrid
|
||||
End If
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Public Shared Sub FillColumns(pDocGridView As GridView,
|
||||
DT_RESULT As DataTable, DT_WINDREAM_RESULTLIST As DataTable, DT_DOCRESULT_DROPDOWN_ITEMS As DataTable,
|
||||
DropdownValueChangedHandler As EventHandler, DatepickerValueChangedHandler As EventHandler, TextValueChangedHandler As EventHandler, CheckValueChangedHandler As EventHandler,
|
||||
SearchType As String, RECORD_ID As Integer)
|
||||
DT_RESULT As DataTable, DT_WINDREAM_RESULTLIST As DataTable, DT_DOCRESULT_DROPDOWN_ITEMS As DataTable,
|
||||
DropdownValueChangedHandler As EventHandler, DatepickerValueChangedHandler As EventHandler, TextValueChangedHandler As EventHandler, CheckValueChangedHandler As EventHandler,
|
||||
SearchType As String, RECORD_ID As Integer)
|
||||
|
||||
' ── 1. KRITISCH: Event-Handler ENTFERNEN vor Neuregistrierung ───────────
|
||||
RemoveHandler pDocGridView.MasterRowExpanded, AddressOf gridView_MasterRowExpanded
|
||||
RemoveHandler pDocGridView.CustomColumnDisplayText, AddressOf gridView_CustomColumnDisplayText
|
||||
RemoveHandler pDocGridView.FocusedRowChanged, AddressOf GVDoc_Values_FocusedRowChanged
|
||||
|
||||
' ── 2. DATE_COLUMNS Listen leeren (verhindert Duplikate) ────────────────
|
||||
DATE_COLUMNS.Clear()
|
||||
DATE_COLUMNS_CONFIG.Clear()
|
||||
|
||||
' Handler speichern
|
||||
_dropdownValueChangedHandler = DropdownValueChangedHandler
|
||||
_datepickerValueChangedHandler = DatepickerValueChangedHandler
|
||||
@@ -299,7 +308,6 @@ Public Class ClassDocGrid
|
||||
Dim columnTitle As String = row.Item("HEADER_CAPTION")
|
||||
Dim type As Integer = row.Item("TYPE_ID")
|
||||
|
||||
|
||||
If type = 3 And isConfig = False Then
|
||||
DATE_COLUMNS.Add(columnTitle)
|
||||
ElseIf type = 3 And isConfig = True Then
|
||||
@@ -329,13 +337,13 @@ Public Class ClassDocGrid
|
||||
|
||||
DT_DETAIL_VALUES = ClassDataCache.GetOrLoad(cacheKey, Function()
|
||||
Dim sql = String.Format(
|
||||
"SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " &
|
||||
"T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " &
|
||||
"FROM TBPMO_DOC_VALUES T " &
|
||||
"INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP ON T.RECORD_ID = TTEMP.RECORD_ID " &
|
||||
"RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " &
|
||||
"WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1",
|
||||
CURRENT_ENTITY_ID, USER_LANGUAGE)
|
||||
"SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " &
|
||||
"T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " &
|
||||
"FROM TBPMO_DOC_VALUES T " &
|
||||
"INNER JOIN TBPMO_STRUCTURE_NODES_USER_TEMP TTEMP ON T.RECORD_ID = TTEMP.RECORD_ID " &
|
||||
"RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " &
|
||||
"WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1",
|
||||
CURRENT_ENTITY_ID, USER_LANGUAGE)
|
||||
Return MYDB_ECM.GetDatatable(sql)
|
||||
End Function, TimeSpan.FromMinutes(2))
|
||||
|
||||
@@ -344,12 +352,12 @@ Public Class ClassDocGrid
|
||||
|
||||
DT_DETAIL_VALUES = ClassDataCache.GetOrLoad(cacheKey, Function()
|
||||
Dim sql = String.Format(
|
||||
"SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " &
|
||||
"T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " &
|
||||
"FROM TBPMO_DOC_VALUES T " &
|
||||
"RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " &
|
||||
"WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1 AND T.RECORD_ID = {2}",
|
||||
CURRENT_ENTITY_ID, USER_LANGUAGE, RECORD_ID)
|
||||
"SELECT T.[GUID],T.[DocID],T.[CONFIG_ID],T1.HEADER_CAPTION,T.[VALUE],T1.[LANGUAGE], " &
|
||||
"T1.COLUMN_VIEW,T1.EDITABLE,T1.TYPE_ID,T1.VISIBLE,T.CHANGED_WHEN,T.CHANGED_WHO " &
|
||||
"FROM TBPMO_DOC_VALUES T " &
|
||||
"RIGHT JOIN TBPMO_DOCSEARCH_RESULTLIST_CONFIG T1 ON T.CONFIG_ID = T1.GUID " &
|
||||
"WHERE T1.ENTITY_ID = {0} AND LANGUAGE = '{1}' AND T1.CONFIG_COLUMNS = 1 AND T.RECORD_ID = {2}",
|
||||
CURRENT_ENTITY_ID, USER_LANGUAGE, RECORD_ID)
|
||||
Return MYDB_ECM.GetDatatable(sql)
|
||||
End Function, TimeSpan.FromMinutes(2))
|
||||
End Select
|
||||
@@ -374,9 +382,6 @@ Public Class ClassDocGrid
|
||||
If oFlteredRows.Length > 0 Then
|
||||
value = oFlteredRows(0)("VALUE").ToString()
|
||||
End If
|
||||
|
||||
|
||||
'value = MYDB_ECM.GetScalarValue(String.Format("SELECT VALUE FROM TBPMO_DOC_VALUES WHERE CONFIG_ID = {0} AND DocID = {1} AND RECORD_ID = {2}", oConfigID, oDocID, RECORD_ID))
|
||||
Catch ex As Exception
|
||||
LOGGER.Warn(String.Format("Attention: Could not get Value from TBPMO_DOC_VALUES for ConfigId[{0}], DocId[{1}]: ", oConfigID, oDocID) & ex.Message)
|
||||
End Try
|
||||
@@ -389,6 +394,7 @@ Public Class ClassDocGrid
|
||||
LOGGER.Warn($"Attention: Could not load values from TBPMO_DOC_VALUES: " & ex.Message & vbNewLine & $"SELECT VALUE FROM TBPMO_DOC_VALUES WHERE CONFIG_ID = {oConfigID} AND DocID = {oDocID} AND RECORD_ID = {RECORD_ID}")
|
||||
End Try
|
||||
LOGGER.Debug("Values loaded...")
|
||||
|
||||
Try
|
||||
' Tabellen zum DataSet hinzufügen
|
||||
ds.Tables.Add(DT_RESULT)
|
||||
@@ -422,24 +428,26 @@ Public Class ClassDocGrid
|
||||
|
||||
Dim gridControl As GridControl = pDocGridView.GridControl
|
||||
|
||||
|
||||
' ── Performance-optimiertes DataSource-Setzen ─────────────────────────
|
||||
' ── 3. KRITISCH: Performance-optimiertes DataSource-Setzen ───────────
|
||||
_isGridRefreshing = True ' Flag setzen VOR DataSource-Änderung
|
||||
Try
|
||||
pDocGridView.BeginDataUpdate() ' Events unterdrücken
|
||||
pDocGridView.BeginUpdate() ' UI-Updates unterdrücken
|
||||
|
||||
' Datasource auf Master-Tabelle setzen
|
||||
gridControl.DataSource = ds.Tables(0)
|
||||
gridControl.ForceInitialize()
|
||||
|
||||
pDocGridView.EndDataUpdate() ' Events reaktivieren
|
||||
pDocGridView.EndUpdate() ' UI-Updates reaktivieren
|
||||
pDocGridView.EndDataUpdate() ' Events reaktivieren
|
||||
Catch ex As Exception
|
||||
LOGGER.Error($"Error setting DataSource: {ex.Message}")
|
||||
Finally
|
||||
_isGridRefreshing = False ' Flag zurücksetzen
|
||||
' Flag NICHT hier zurücksetzen - erst NACH allen Grid-Operationen!
|
||||
End Try
|
||||
|
||||
' Detail View anlegen und der Relation `docIdDetails` zuweisen
|
||||
Dim GVDoc_Values As New GridView(gridControl)
|
||||
'grvwDetail.OptionsBehavior.Editable = False
|
||||
GVDoc_Values.OptionsView.ShowGroupPanel = False
|
||||
GVDoc_Values.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.Style3D
|
||||
GVDoc_Values.OptionsView.EnableAppearanceEvenRow = True
|
||||
@@ -447,18 +455,17 @@ Public Class ClassDocGrid
|
||||
GVDoc_Values.Appearance.HeaderPanel.BackColor = Color.Orange
|
||||
GVDoc_Values.Appearance.HeaderPanel.Options.UseBackColor = True
|
||||
|
||||
|
||||
gridControl.LevelTree.Nodes.Add("docIdDetails", GVDoc_Values)
|
||||
Catch ex As Exception
|
||||
MsgBox("Error in FillColumns: " & vbNewLine & ex.Message, MsgBoxStyle.Critical)
|
||||
LOGGER.Warn("Attention: Could not load converted datatable DocSearch: " & ex.Message)
|
||||
End Try
|
||||
|
||||
' ── 4. KRITISCH: Handler NACH DataSource-Setzen registrieren ─────────────
|
||||
AddHandler pDocGridView.MasterRowExpanded, AddressOf gridView_MasterRowExpanded
|
||||
AddHandler pDocGridView.CustomColumnDisplayText, AddressOf gridView_CustomColumnDisplayText
|
||||
AddHandler pDocGridView.FocusedRowChanged, AddressOf GVDoc_Values_FocusedRowChanged
|
||||
|
||||
|
||||
For Each row As DataRow In DT_WINDREAM_RESULTLIST.Rows
|
||||
Dim col As GridColumn = pDocGridView.Columns(row.Item("HEADER_CAPTION"))
|
||||
Dim colCaption = row.Item("HEADER_CAPTION")
|
||||
@@ -501,18 +508,22 @@ Public Class ClassDocGrid
|
||||
oChangedColumn.DisplayFormat.FormatString = CURRENT_DATE_FORMAT & " HH:MM:ss"
|
||||
End If
|
||||
|
||||
' ── 5. BestFitColumns mit gesetztem Flag ──────────────────────────────────
|
||||
If GridDocResult_BestFitColumns Then
|
||||
_isGridRefreshing = True ' Auch hier Events unterdrücken
|
||||
' _isGridRefreshing ist bereits True
|
||||
Try
|
||||
pDocGridView.BeginUpdate()
|
||||
pDocGridView.OptionsView.BestFitMaxRowCount = -1
|
||||
pDocGridView.BestFitColumns(True)
|
||||
pDocGridView.EndUpdate()
|
||||
Finally
|
||||
_isGridRefreshing = False
|
||||
Catch ex As Exception
|
||||
LOGGER.Error($"Error in BestFitColumns: {ex.Message}")
|
||||
End Try
|
||||
End If
|
||||
|
||||
' ── 6. KRITISCH: Flag ERST JETZT zurücksetzen! ────────────────────────────
|
||||
_isGridRefreshing = False
|
||||
|
||||
' Alle Spalten aus ReadOnly setzen, danach werden alle passenden auf nicht ReadOnly gesetzt
|
||||
For Each column As GridColumn In pDocGridView.Columns
|
||||
column.OptionsColumn.AllowEdit = False
|
||||
@@ -623,69 +634,54 @@ Public Class ClassDocGrid
|
||||
End If
|
||||
|
||||
Dim fieldName As String = e.Column.FieldName
|
||||
Dim valueString As String = e.Value.ToString()
|
||||
|
||||
' ── WICHTIG: Verhindere rekursive Aufrufe ────────────────────────────
|
||||
' Wenn DisplayText bereits korrekt ist, nichts ändern
|
||||
If e.DisplayText = valueString Then Return
|
||||
|
||||
Dim parsedDate As DateTime
|
||||
|
||||
' ── Datumskonvertierung für Standard-Datumsspalten ───────────────────
|
||||
If DATE_COLUMNS IsNot Nothing AndAlso DATE_COLUMNS.Contains(fieldName) Then
|
||||
' Nur bei Verbose-Logging loggen
|
||||
If EnableVerboseGridLogging Then
|
||||
LOGGER.Debug($"gridView_CustomColumnDisplayText [Standard] [{fieldName}]")
|
||||
End If
|
||||
|
||||
Try
|
||||
' Versuche direktes Parsen
|
||||
If DateTime.TryParse(e.Value.ToString(), parsedDate) Then
|
||||
e.DisplayText = parsedDate.ToString(CURRENT_DATE_FORMAT & " HH:mm:ss")
|
||||
Else
|
||||
' Fallback: ParseExact
|
||||
parsedDate = DateTime.ParseExact(e.Value.ToString(),
|
||||
CURRENT_DATE_FORMAT & " HH:mm:ss",
|
||||
System.Globalization.DateTimeFormatInfo.InvariantInfo)
|
||||
e.DisplayText = parsedDate.ToString(CURRENT_DATE_FORMAT & " HH:mm:ss")
|
||||
If DateTime.TryParse(valueString, parsedDate) Then
|
||||
Dim formattedDate As String = parsedDate.ToString(CURRENT_DATE_FORMAT & " HH:mm:ss")
|
||||
' Nur setzen wenn unterschiedlich
|
||||
If e.DisplayText <> formattedDate Then
|
||||
e.DisplayText = formattedDate
|
||||
End If
|
||||
End If
|
||||
Catch ex As FormatException
|
||||
' Bei Parsing-Fehler Original-Wert anzeigen
|
||||
e.DisplayText = e.Value.ToString()
|
||||
' Bei Fehler Original-Wert belassen (NICHT setzen!)
|
||||
If EnableVerboseGridLogging Then
|
||||
LOGGER.Debug($"Date parsing failed for [{fieldName}]: {e.Value}")
|
||||
LOGGER.Debug($"Date parsing failed for [{fieldName}]: {valueString}")
|
||||
End If
|
||||
End Try
|
||||
|
||||
Return ' Früher Exit - keine weitere Prüfung nötig
|
||||
Return
|
||||
End If
|
||||
|
||||
' ── Datumskonvertierung für Config-Datumsspalten ──────────────────────
|
||||
If DATE_COLUMNS_CONFIG IsNot Nothing AndAlso DATE_COLUMNS_CONFIG.Contains(fieldName) Then
|
||||
' Nur bei Verbose-Logging loggen
|
||||
If EnableVerboseGridLogging Then
|
||||
LOGGER.Debug($"gridView_CustomColumnDisplayText [Config] [{fieldName}]")
|
||||
End If
|
||||
|
||||
Try
|
||||
' Versuche direktes Parsen
|
||||
If DateTime.TryParse(e.Value.ToString(), parsedDate) Then
|
||||
e.DisplayText = parsedDate.ToString(CURRENT_DATE_FORMAT)
|
||||
Else
|
||||
' Fallback: ParseExact
|
||||
parsedDate = DateTime.ParseExact(e.Value.ToString(),
|
||||
CURRENT_DATE_FORMAT,
|
||||
System.Globalization.DateTimeFormatInfo.InvariantInfo)
|
||||
e.DisplayText = parsedDate.ToString(CURRENT_DATE_FORMAT)
|
||||
If DateTime.TryParse(valueString, parsedDate) Then
|
||||
Dim formattedDate As String = parsedDate.ToString(CURRENT_DATE_FORMAT)
|
||||
' Nur setzen wenn unterschiedlich
|
||||
If e.DisplayText <> formattedDate Then
|
||||
e.DisplayText = formattedDate
|
||||
End If
|
||||
End If
|
||||
Catch ex As FormatException
|
||||
' Bei Parsing-Fehler Original-Wert anzeigen
|
||||
e.DisplayText = e.Value.ToString()
|
||||
' Bei Fehler Original-Wert belassen
|
||||
If EnableVerboseGridLogging Then
|
||||
LOGGER.Debug($"Date parsing failed for [{fieldName}]: {e.Value}")
|
||||
LOGGER.Debug($"Date parsing failed for [{fieldName}]: {valueString}")
|
||||
End If
|
||||
End Try
|
||||
End If
|
||||
|
||||
Catch ex As Exception
|
||||
' Fehler IMMER loggen (aber nicht Debug)
|
||||
LOGGER.Error($"gridView_CustomColumnDisplayText Error [{e.Column?.FieldName}]: {ex.Message}")
|
||||
End Try
|
||||
|
||||
End Sub
|
||||
Public Shared Sub GVDoc_Values_FocusedRowChanged(sender As GridView, e As DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs)
|
||||
Try
|
||||
|
||||
Reference in New Issue
Block a user