LookupGrid: handle empty datasource better

This commit is contained in:
Jonathan Jenne 2020-05-20 13:36:11 +02:00
parent 7d8300a1db
commit 8e864d5b07

View File

@ -10,61 +10,62 @@ Public Class frmLookupGrid
Public Property DataSource As DataTable Public Property DataSource As DataTable
Public Property SelectedValues As List(Of String) Public Property SelectedValues As List(Of String)
Private dataColumn As Integer Private _DataColumn As Integer
Private dataSourceTemp As DataTable Private _DataSourceTemp As DataTable
Private view As GridView Private _View As GridView
Private grid As GridControl Private _Grid As GridControl
Private Sub frmLookupGrid_Load(sender As Object, e As EventArgs) Handles Me.Load Private Sub frmLookupGrid_Load(sender As Object, e As EventArgs) Handles Me.Load
view = viewLookup _View = viewLookup
grid = gridLookup _Grid = gridLookup
If DataSource Is Nothing Then
Exit Sub
End If
' Original Datasource soll nicht verändert werden ' Original Datasource soll nicht verändert werden
dataSourceTemp = DataSource.Copy() If DataSource Is Nothing Then
_DataSourceTemp = New DataTable("TEMP")
_DataSourceTemp.Columns.Add(New DataColumn("VALUE"))
Else
_DataSourceTemp = DataSource.Copy()
End If
If MultiSelect Then If MultiSelect Then
If Not dataSourceTemp.Columns.Contains("SELECTED") Then If Not _DataSourceTemp.Columns.Contains("SELECTED") Then
Dim selectedColumn = New DataColumn() With { Dim selectedColumn = New DataColumn() With {
.ColumnName = "SELECTED", .ColumnName = "SELECTED",
.DataType = GetType(Boolean), .DataType = GetType(Boolean),
.DefaultValue = False .DefaultValue = False
} }
dataSourceTemp.Columns.Add(selectedColumn) _DataSourceTemp.Columns.Add(selectedColumn)
selectedColumn.SetOrdinal(0) selectedColumn.SetOrdinal(0)
End If End If
End If End If
' Datasource setzen ' Datasource setzen
grid.DataSource = dataSourceTemp _Grid.DataSource = _DataSourceTemp
' Anzeige Eigeschaften setzen ' Anzeige Eigeschaften setzen
view.OptionsFind.Condition = DevExpress.Data.Filtering.FilterCondition.Contains _View.OptionsFind.Condition = DevExpress.Data.Filtering.FilterCondition.Contains
view.OptionsFind.AlwaysVisible = True _View.OptionsFind.AlwaysVisible = True
view.OptionsSelection.MultiSelect = False _View.OptionsSelection.MultiSelect = False
If MultiSelect Then If MultiSelect Then
' Selected Spalte anpassen ' Selected Spalte anpassen
Dim checkboxColumn = view.Columns.Item(0) Dim oCheckboxColumn = _View.Columns.Item(0)
checkboxColumn.Caption = " " oCheckboxColumn.Caption = " "
checkboxColumn.MaxWidth = 10 oCheckboxColumn.MaxWidth = 10
Text = "Wählen Sie einen oder mehrere Werte:" Text = "Wählen Sie einen oder mehrere Werte:"
dataColumn = 1 _DataColumn = 1
Else Else
Text = "Wählen Sie einen Wert:" Text = "Wählen Sie einen Wert:"
dataColumn = 0 _DataColumn = 0
End If End If
If AddNewValues Then If AddNewValues Then
view.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.True _View.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.True
view.OptionsView.NewItemRowPosition = NewItemRowPosition.Top _View.OptionsView.NewItemRowPosition = NewItemRowPosition.Top
Else Else
view.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.False _View.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.False
view.OptionsView.NewItemRowPosition = NewItemRowPosition.None _View.OptionsView.NewItemRowPosition = NewItemRowPosition.None
End If End If
If SelectedValues Is Nothing Then If SelectedValues Is Nothing Then
@ -72,24 +73,24 @@ Public Class frmLookupGrid
End If End If
' Bereits ausgewählte Werte im grid auswählen ' Bereits ausgewählte Werte im grid auswählen
SyncItemsWithView(view) SyncItemsWithView(_View)
' Focus auf Find panel setzen ' Focus auf Find panel setzen
view.ShowFindPanel() _View.ShowFindPanel()
' Spaltenbreite anpassen ' Spaltenbreite anpassen
view.BestFitColumns() _View.BestFitColumns()
End Sub End Sub
Private Sub SaveSelectedValues() Private Sub SaveSelectedValues()
' Filter vor dem Auslesen entfernen, damit alle Werte erfasst werden ' Filter vor dem Auslesen entfernen, damit alle Werte erfasst werden
view.FindFilterText = String.Empty _View.FindFilterText = String.Empty
If MultiSelect Then If MultiSelect Then
Dim oValues As New List(Of String) Dim oValues As New List(Of String)
For oIndex = 0 To viewLookup.DataRowCount - 1 For oIndex = 0 To viewLookup.DataRowCount - 1
Dim oRow As DataRow = view.GetDataRow(oIndex) Dim oRow As DataRow = _View.GetDataRow(oIndex)
Dim oSelected As Boolean = oRow.Item(0) Dim oSelected As Boolean = oRow.Item(0)
Dim oValue As Object = oRow.Item(1) Dim oValue As Object = oRow.Item(1)
@ -105,8 +106,8 @@ Public Class frmLookupGrid
SelectedValues = oValues SelectedValues = oValues
Else Else
Dim oRowHandle As Integer = view.GetSelectedRows().ToList().FirstOrDefault() Dim oRowHandle As Integer = _View.GetSelectedRows().ToList().FirstOrDefault()
Dim oRow As DataRow = view.GetDataRow(oRowHandle) Dim oRow As DataRow = _View.GetDataRow(oRowHandle)
Dim oValues As New List(Of String) Dim oValues As New List(Of String)
If oRow IsNot Nothing Then If oRow IsNot Nothing Then
@ -128,7 +129,7 @@ Public Class frmLookupGrid
If rowView IsNot Nothing Then If rowView IsNot Nothing Then
Dim row As DataRow = rowView.Row Dim row As DataRow = rowView.Row
Dim value = row.Item(dataColumn) Dim value = row.Item(_DataColumn)
If SelectedValues.Contains(value) Then If SelectedValues.Contains(value) Then
If MultiSelect Then If MultiSelect Then
@ -187,8 +188,8 @@ Public Class frmLookupGrid
End Sub End Sub
Private Sub viewLookup_ShowingEditor(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles viewLookup.ShowingEditor Private Sub viewLookup_ShowingEditor(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles viewLookup.ShowingEditor
Dim rowHandleIsNewItemRow = (view.FocusedRowHandle = GridControl.NewItemRowHandle) Dim rowHandleIsNewItemRow = (_View.FocusedRowHandle = GridControl.NewItemRowHandle)
Dim columnIsCheckboxColumn = view.FocusedColumn.FieldName = "SELECTED" Dim columnIsCheckboxColumn = _View.FocusedColumn.FieldName = "SELECTED"
' Prevent editing of Data Column/allow editing for Checkbox Column and NewValue Row ' Prevent editing of Data Column/allow editing for Checkbox Column and NewValue Row
If rowHandleIsNewItemRow Or columnIsCheckboxColumn Then If rowHandleIsNewItemRow Or columnIsCheckboxColumn Then
@ -206,10 +207,10 @@ Public Class frmLookupGrid
' If multiselect is true, check the current row ' If multiselect is true, check the current row
' If multiselect is false, select the current row and close the window ' If multiselect is false, select the current row and close the window
If MultiSelect = True Then If MultiSelect = True Then
Dim row As DataRow = view.GetDataRow(e.RowHandle) Dim row As DataRow = _View.GetDataRow(e.RowHandle)
row.Item(0) = Not CBool(row.Item(0)) row.Item(0) = Not CBool(row.Item(0))
Else Else
Dim row As DataRow = view.GetDataRow(e.RowHandle) Dim row As DataRow = _View.GetDataRow(e.RowHandle)
Dim value = row.Item(0) Dim value = row.Item(0)
SelectedValues = New List(Of String) From {value} SelectedValues = New List(Of String) From {value}