Imports DevExpress.Data Imports DevExpress.XtraGrid.Controls Imports DevExpress.XtraGrid.Views.Base Imports DevExpress.XtraGrid.Views.Grid Public Class frmLookupGrid Public Property MultiSelect As Boolean Public Property DataSource As DataTable Public Property SelectedValues As List(Of Object) Private originalValues As List(Of Object) Private Sub frmLookupGrid_Load(sender As Object, e As EventArgs) Handles Me.Load Dim view As GridView = gridLookup.DefaultView ' Anzeige Eigeschaften setzen view.OptionsFind.AlwaysVisible = True If MultiSelect Then Text = "Wählen Sie einen oder mehrere Werte:" view.OptionsSelection.MultiSelect = True view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect Else Text = "Wählen Sie einen Wert:" view.OptionsSelection.MultiSelect = False view.OptionsSelection.MultiSelectMode = GridMultiSelectMode.RowSelect End If ' Datasource setzen gridLookup.DataSource = DataSource ' Wenn Selected Values nicht gesetzt ist, leere Liste anlegen If SelectedValues Is Nothing Then SelectedValues = New List(Of Object) End If ' Ursprüngliche Werte zwischenspeichern originalValues = SelectedValues 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 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) If SelectedValues.Contains(value) Then view.SelectRow(rowHandle) End If End If Next End If 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 If MultiSelect Then SelectedValues = values Else SelectedValues = New List(Of Object) From {values.First()} End If End Sub Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click SelectedValues = New List(Of Object) End Sub Private Sub frmLookupGrid_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 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) 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() End If End Sub End Class