Imports System.Drawing Imports System.ComponentModel Imports System.Windows.Forms Imports DevExpress.XtraEditors Imports DevExpress.XtraEditors.Repository Imports DevExpress.XtraEditors.Registrator Imports DevExpress.XtraEditors.ViewInfo Imports DevExpress.XtraEditors.Drawing Imports DevExpress.Accessibility Imports DevExpress.XtraEditors.Controls Public Class LookupControl3 Inherits GridLookUpEdit Shared Sub New() RepositoryItemLookupControl3.RegisterLookupControl() End Sub Public Sub New() End Sub Public Shadows ReadOnly Property Properties As RepositoryItemLookupControl3 Get Return TryCast(MyBase.Properties, RepositoryItemLookupControl3) End Get End Property Public Overrides ReadOnly Property EditorTypeName As String Get Return RepositoryItemLookupControl3.CustomEditName End Get End Property End Class Public Class RepositoryItemLookupControl3 Inherits RepositoryItemGridLookUpEdit Shared Sub New() RegisterLookupControl() End Sub Private Const TAG_DROPDOWN = "openDropdown" Private Const TAG_BUTTON_LOOKUP_FORM = "openLookupForm" Private Const TEXT_NO_RECORDS = "Keine Datensätze ausgewählt" Private Const TEXT_ONE_RECORD = "Ein Datensatz ausgewählt" Private Const TEXT_N_RECORDS = "{0} Datensätze ausgewählt" Private _SelectedValues As New List(Of String) Private _MultiSelect As Boolean = False Private _ReadOnly As Boolean = False Public Const CustomEditName As String = "LookupControl3" Public Property AllowAddNewValues As Boolean Public Property PreventDuplicates As Boolean Public Overloads Property DataSource As DataTable Public Delegate Sub SelectedValuesChangedHandler(sender As Object, SelectedValues As List(Of String)) Public Event SelectedValuesChanged As SelectedValuesChangedHandler Public Overrides ReadOnly Property EditorTypeName As String Get Return CustomEditName End Get End Property Public Overloads Property [ReadOnly] As Boolean Get Return _ReadOnly End Get Set(value As Boolean) SetFormButtonEnabled(Not value) _ReadOnly = value End Set End Property Public Property MultiSelect As Boolean Get Return _MultiSelect End Get Set(value As Boolean) SetDropdownButtonEnabled(value) _MultiSelect = value End Set End Property Public Property SelectedValues As List(Of String) Get Return _SelectedValues End Get Set(value As List(Of String)) UpdateSelectedValues(value) End Set End Property Public Shared Sub RegisterLookupControl() Dim img As Image = Nothing Dim oClassInfo = New EditorClassInfo( CustomEditName, GetType(LookupControl3), GetType(RepositoryItemLookupControl3), GetType(GridLookUpEditBaseViewInfo), New ButtonEditPainter(), True, img, GetType(ButtonEditAccessible) ) EditorRegistrationInfo.Default.Editors.Add(oClassInfo) End Sub Private Sub SetFormButtonEnabled(pVisible As Boolean) Dim oButton As EditorButton = Buttons. Where(Function(b) b.Tag = TAG_BUTTON_LOOKUP_FORM). FirstOrDefault() If oButton IsNot Nothing Then oButton.Visible = pVisible End If End Sub Private Sub SetDropdownButtonEnabled(pVisible As Boolean) Dim oButton As EditorButton = Buttons. Where(Function(b) b.Tag = TAG_DROPDOWN). FirstOrDefault() If oButton IsNot Nothing Then oButton.Visible = pVisible End If End Sub ''' ''' Prevents Editvalue changing when multiselect is true ''' Private Sub HandleEditValueChanging(sender As Object, e As ChangingEventArgs) If MultiSelect Then e.Cancel = True End If End Sub Private Sub UpdateSelectedValues(Values As List(Of String)) If Values Is Nothing OrElse Values.Count = 0 Then Exit Sub End If Values.RemoveAll(Function(v) String.IsNullOrEmpty(v)) If MultiSelect = True Then ' DataSource = Values Select Case Values.Count Case 0 NullText = TEXT_NO_RECORDS Case 1 NullText = TEXT_ONE_RECORD Case Else NullText = String.Format(TEXT_N_RECORDS, Values.Count) End Select Else NullText = Values.FirstOrDefault() OwnerEdit.Text = Values.FirstOrDefault() OwnerEdit.EditValue = Values.FirstOrDefault() End If _SelectedValues = Values RaiseEvent SelectedValuesChanged(Me, Values) End Sub Private Function GetLookupForm() As frmLookupGrid Dim oForm As New frmLookupGrid() With { .MultiSelect = MultiSelect, .AddNewValues = AllowAddNewValues, .PreventDuplicates = PreventDuplicates, .DataSource = DataSource, .SelectedValues = SelectedValues, .StartPosition = FormStartPosition.Manual, .Location = OwnerEdit.PointToScreen(New Point(OwnerEdit.Width, 0)) } Return oForm End Function Protected Overrides Sub RaiseButtonClick(e As ButtonPressedEventArgs) Select Case e.Button.Tag Case TAG_BUTTON_LOOKUP_FORM Using oForm = GetLookupForm() Dim oResult = oForm.ShowDialog() If oResult = Windows.Forms.DialogResult.OK Then Dim oValues = oForm.SelectedValues UpdateSelectedValues(oValues) End If End Using Case Else MyBase.RaiseButtonClick(e) End Select End Sub Public Overrides Sub Assign(item As RepositoryItem) BeginUpdate() Try MyBase.Assign(item) Dim source As RepositoryItemLookupControl3 = TryCast(item, RepositoryItemLookupControl3) If source Is Nothing Then Return End If Finally EndUpdate() End Try End Sub Public Overrides Sub EndInit() MyBase.EndInit() Dim oLookupFormButton = New EditorButton() With { .Kind = ButtonPredefines.Search, .Tag = TAG_BUTTON_LOOKUP_FORM, .Width = 20 } ' Add button if it does not already exists If Buttons.Contains(oLookupFormButton) = False Then Buttons.Insert(0, oLookupFormButton) ' Set the button which opens the dropdown ActionButtonIndex = 1 End If End Sub Protected Overrides Sub RaiseQueryPopUp(e As CancelEventArgs) If MultiSelect = True Then MyBase.RaiseQueryPopUp(e) End If End Sub End Class