jj: add preventduplicate values and add new items to lookupGrid

This commit is contained in:
Jonathan Jenne
2018-08-23 15:28:11 +02:00
parent d352487f29
commit 433155e804
10 changed files with 440 additions and 263 deletions

View File

@@ -1,33 +1,48 @@
Imports DevExpress.Data
Imports DevExpress.XtraGrid.Controls
Imports DevExpress.XtraGrid.Views.Base
Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Views.Grid
Public Class frmLookupGrid
Public Property MultiSelect As Boolean
Public Property AddNewValues As Boolean
Public Property PreventDuplicates As Boolean
Public Property DataSource As DataTable
Public Property SelectedValues As List(Of Object)
Private originalValues As List(Of Object)
Private dataColumn As Integer
Private view As GridView
Private grid As GridControl
Private Sub frmLookupGrid_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim view As GridView = gridLookup.DefaultView
view = viewLookup
grid = gridLookup
' Datasource setzen
grid.DataSource = DataSource
' Anzeige Eigeschaften setzen
view.OptionsFind.AlwaysVisible = True
view.OptionsSelection.MultiSelect = False
If MultiSelect Then
' Selected Spalte anpassen
view.Columns.Item(0).Caption = " "
view.Columns.Item(0).Resize(10)
Text = "Wählen Sie einen oder mehrere Werte:"
view.OptionsSelection.MultiSelect = True
view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect
dataColumn = 1
Else
Text = "Wählen Sie einen Wert:"
view.OptionsSelection.MultiSelect = False
view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.RowSelect
dataColumn = 0
End If
' Datasource setzen
gridLookup.DataSource = DataSource
If AddNewValues Then
view.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.True
view.OptionsView.NewItemRowPosition = NewItemRowPosition.Top
Else
view.OptionsBehavior.AllowAddRows = DevExpress.Utils.DefaultBoolean.False
view.OptionsView.NewItemRowPosition = NewItemRowPosition.None
End If
' Wenn Selected Values nicht gesetzt ist, leere Liste anlegen
If SelectedValues Is Nothing Then
@@ -37,48 +52,31 @@ Public Class frmLookupGrid
' Ursprüngliche Werte zwischenspeichern
originalValues = SelectedValues
' Bereits ausgewählte Werte im grid auswählen
SyncItemsWithView(view)
' Focus auf Find panel setzen
view.ShowFindPanel()
End Sub
Private Sub frmLookupGrid_Shown(sender As Object, e As EventArgs) Handles Me.Shown
Dim findEditor As DevExpress.XtraEditors.MRUEdit = gridLookup.Controls.Find("teFind", True).FirstOrDefault()
If findEditor IsNot Nothing Then
'AddHandler findEditor.KeyUp, AddressOf FindPanel_KeyUp
AddHandler findEditor.EditValueChanged, AddressOf FindPanel_KeyUp
End If
End Sub
Private OldFindPanelValue As String = ""
Private Sub FindPanel_KeyUp(sender As Object, e As EventArgs)
Dim findEditor As DevExpress.XtraEditors.MRUEdit = sender
If findEditor.EditValue.ToString.Count = 0 And OldFindPanelValue.Count > 0 Then
SyncItemsWithView(viewLookup)
End If
OldFindPanelValue = findEditor.EditValue
End Sub
Private Sub SyncItemsWithView(view As GridView)
' Wenn Vorbelegungen existieren
' und Mehrfachauswahl ausgewählt ist, werden diese angehakt
If SelectedValues.Count > 0 And MultiSelect Then
' Wenn Vorbelegungen existieren, werden diese angehakt
If SelectedValues.Count > 0 Then
For i = 0 To view.DataRowCount - 1
Dim rowHandle = view.GetRowHandle(i)
Dim rowView As DataRowView = view.GetRow(rowHandle)
If rowView IsNot Nothing Then
Dim row As DataRow = rowView.Row
Dim value = row.Item(0)
Dim value = row.Item(dataColumn)
If SelectedValues.Contains(value) Then
view.SelectRow(rowHandle)
If MultiSelect Then
row.Item(0) = True
Else
view.SelectRow(rowHandle)
End If
End If
End If
Next
@@ -86,48 +84,66 @@ Public Class frmLookupGrid
End Sub
Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click
Dim view As GridView = gridLookup.DefaultView
Dim selectedRows = view.GetSelectedRows()
Dim values As New List(Of Object)
For Each rowHandle In selectedRows
Dim value = view.GetDataRow(rowHandle)
values.Add(value.Item(0))
Next
' Filter vor dem Auslesen entfernen, damit alle Werte erfasst werden
view.FindFilterText = String.Empty
If MultiSelect Then
Dim values As New List(Of Object)
For index = 0 To viewLookup.DataRowCount - 1
Dim row As DataRow = view.GetDataRow(index)
Dim selected As Boolean = row.Item(0)
Dim value As Object = row.Item(1)
If selected Then
values.Add(value)
End If
Next
' Doppelte Werte entfernen, wenn konfiguriert
If PreventDuplicates Then
values = values.Distinct().ToList()
End If
SelectedValues = values
Else
SelectedValues = New List(Of Object) From {values.First()}
Dim rowHandle As Integer = view.GetSelectedRows().ToList().First()
Dim row As DataRow = view.GetDataRow(rowHandle)
Dim value = row.Item(0)
SelectedValues = New List(Of Object) From {value}
End If
End Sub
Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
SelectedValues = New List(Of Object)
SelectedValues.Clear()
End Sub
Private Sub frmLookupGrid_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
Private Sub gridLookup_KeyUp(sender As Object, e As KeyEventArgs) Handles gridLookup.KeyUp
If e.KeyCode = Keys.Escape Then
Close()
End If
End Sub
Private Sub viewLookup_SelectionChanged(sender As Object, e As DevExpress.Data.SelectionChangedEventArgs) Handles viewLookup.SelectionChanged
If e.Action = System.ComponentModel.CollectionChangeAction.Add Then
Dim row = viewLookup.GetRow(e.ControllerRow)
Dim value As Object = row.item(0)
Private Sub viewLookup_CellValueChanging(sender As Object, e As Views.Base.CellValueChangedEventArgs) Handles viewLookup.CellValueChanging
SelectedValues.Add(value)
ElseIf e.Action = System.ComponentModel.CollectionChangeAction.Remove Then
Dim row = viewLookup.GetRow(e.ControllerRow)
Dim value As Object = row.item(0)
SelectedValues = (From v In SelectedValues
Where v <> value
Select v).ToList()
If e.RowHandle = GridControl.NewItemRowHandle Then
Exit Sub
End If
Dim rowHandle = e.RowHandle
Dim column = e.Column
End Sub
Private Sub viewLookup_ShowingEditor(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles viewLookup.ShowingEditor
Dim rowHandleIsNewItemRow = (view.FocusedRowHandle = GridControl.NewItemRowHandle)
Dim columnIsCheckboxColumn = view.FocusedColumn.FieldName = "SELECTED"
' Prevent editing of Data Column/allow editing for Checkbox Column and NewValue Row
If rowHandleIsNewItemRow Or columnIsCheckboxColumn Then
e.Cancel = False
Else
e.Cancel = True
End If
End Sub
End Class