Imports Infragistics.Win.UltraWinGrid Imports Infragistics.Win.UltraWinDataSource Imports Infragistics.Win.UltraWinEditors Namespace SnelStart.XD.Controls ''' ''' Bevat een eigen geimplementeerde editor die mbv een dropdown een grid toont om een waarde te kunnen selecteren ''' Public Class ComboEditorXD Inherits Infragistics.Win.UltraWinEditors.UltraTextEditor Public Event SelectedObjectChanged As Eventhandler Private WithEvents varComboGrid As New UltraGrid Private WithEvents varNewdropdowneditorbutton As DropDownEditorButton Private varDisplayMember As String Private varSelectedObjectMember As String Private varSelectedObject As Object ''' ''' Voor het instellen van de datasource van de dropdown ''' ''' ''' Voert bij het instellen direct een databind uit ''' Public Property DataSource() As Object Get Return varComboGrid.DataSource End Get Set(ByVal value As Object) varComboGrid.DataSource = value varComboGrid.DataBind() If varComboGrid.Rows.Count > 0 Then varComboGrid.Rows(0).Selected = True varComboGrid.Rows(0).Activate() End If End Set End Property ''' ''' Geeft aan welke kolom als bron voor de text moet worden gebruikt bij het selecteren van een item uit de lijst ''' Public Property DisplayMember() As String Get Return varDisplayMember End Get Set(ByVal value As String) varDisplayMember = value End Set End Property Public Property SelectedObjectMember() As String Get Return varSelectedObjectMember End Get Set(ByVal Value As String) varSelectedObjectMember = Value End Set End Property ''' ''' Het huidige geselecteerde object ''' Public Property SelectedObject() As Object Get Return varSelectedObject End Get Set(ByVal value As Object) varSelectedObject = value RaiseEvent SelectedObjectChanged(Me, New EventArgs) End Set End Property Public Overrides Property Text() As String Get Return MyBase.Text End Get Set(ByVal value As String) MyBase.Text = value End Set End Property Public Overrides Property Value() As Object Get Return Me.SelectedObject End Get Set(ByVal value As Object) Me.SelectedObject = value End Set End Property Protected Overrides Sub FireValueChanged(ByVal e As System.EventArgs) MyBase.FireValueChanged(e) End Sub ''' ''' Constructor ''' ''' ''' Stelt de zichtbaarheid en owner van de combogrid in naar zichzelf zodat de layout van het grid ''' dat in de dropdown wordt geopend alvast wordt geinitialiseerd ''' Public Sub New() varComboGrid.Visible = True varComboGrid.Parent = Me End Sub ''' ''' initialisatie van de eigen controls ''' Protected Overrides Sub OnCreateControl() MyBase.OnCreateControl() Me.ButtonsRight.Clear() varNewdropdowneditorbutton = New DropDownEditorButton varNewdropdowneditorbutton.Control = varComboGrid varNewdropdowneditorbutton.RightAlignDropDown = Infragistics.Win.DefaultableBoolean.False Me.ButtonsRight.Add(varNewdropdowneditorbutton) GridUtils.GridOverzichtInstellen(varComboGrid) ' Specifiek maken voor dropdown. varComboGrid.CreationFilter = Nothing varComboGrid.DisplayLayout.Appearance.BackColor = Color.White varNewdropdowneditorbutton.AutoFocus = False End Sub ''' ''' Stel de hoogte en breedte van de dropdown in voordat deze wordt geopend adhv de kolombreedtes + het aantal rijen ''' Private Sub varNewdropdowneditorbutton_BeforeDropDown(ByVal sender As Object, ByVal e As Infragistics.Win.UltraWinEditors.BeforeEditorButtonDropDownEventArgs) Handles varNewdropdowneditorbutton.BeforeDropDown varNewdropdowneditorbutton.Control.Width = Aggregate column In varComboGrid.DisplayLayout.Bands(0).Columns.All Into Sum(DirectCast(column, UltraGridColumn).Width) varNewdropdowneditorbutton.Control.Width += 40 varNewdropdowneditorbutton.Control.Height = Math.Min(varComboGrid.Rows.VisibleRowCount * 20 + varComboGrid.DisplayLayout.Bands(0).TotalHeaderHeight, 200) End Sub ''' ''' Het instellen van de textwaarde van de textbox als een item uit de dropdownlijst wordt geselecteerd ''' Private Sub SetDisplayValue() If varComboGrid.Selected.Rows.Count > 0 Then If String.IsNullOrEmpty(varDisplayMember) Then Me.Text = varComboGrid.Selected.Rows(0).Cells(0).Value.ToString Else Me.Text = varComboGrid.Selected.Rows(0).Cells(varDisplayMember).Value.ToString End If If String.IsNullOrEmpty(varSelectedObjectMember) Then Me.SelectedObject = varComboGrid.Selected.Rows(0).Cells(0).Value Else Me.SelectedObject = varComboGrid.Selected.Rows(0).Cells(varSelectedObjectMember).Value End If varNewdropdowneditorbutton.CloseUp() Me.SelectAll() End If End Sub ''' ''' Afvangen van keydown op het grid in de dropdown ''' ''' ''' bij het afvangen van de tabtoets wordt de eventhandler op handled gezet ''' Private Sub varComboGrid_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles varComboGrid.KeyDown If e.KeyCode = Keys.Enter AndAlso varComboGrid.Selected.Rows.Count = 1 Then SetDisplayValue() ElseIf (e.KeyCode = Keys.F4 OrElse e.KeyCode = Keys.Escape) AndAlso varNewdropdowneditorbutton.IsDroppedDown Then varNewdropdowneditorbutton.CloseUp() ElseIf e.KeyCode = Keys.Tab Then Me.TopLevelControl.SelectNextControl(Me, True, True, True, True) e.Handled = True End If End Sub ''' ''' afvangen van keydown op de teksteditor ''' Private Sub ComboEditorXD_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown Select Case e.KeyCode Case Keys.F4 If e.Alt = False Then 'uitzondering voor "alt+F4" -> sluiten venster If varNewdropdowneditorbutton.IsDroppedDown Then varNewdropdowneditorbutton.CloseUp() Else varNewdropdowneditorbutton.DropDown() varNewdropdowneditorbutton.Control.Focus() End If End If Case Keys.Down If varNewdropdowneditorbutton.IsDroppedDown = False Then varNewdropdowneditorbutton.DropDown() ElseIf varNewdropdowneditorbutton.Control.Focused = False Then varComboGrid.PerformAction(UltraGridAction.NextRow, False, False) End If varNewdropdowneditorbutton.Control.Focus() Case Keys.Up If varNewdropdowneditorbutton.IsDroppedDown = False Then varNewdropdowneditorbutton.DropDown() ElseIf varNewdropdowneditorbutton.Control.Focused = False Then varComboGrid.PerformAction(UltraGridAction.PrevRow, False, False) End If varNewdropdowneditorbutton.Control.Focus() Case Keys.Escape varNewdropdowneditorbutton.CloseUp() Case Keys.Enter If varNewdropdowneditorbutton.IsDroppedDown Then SetDisplayValue() End If End Select End Sub ''' ''' Afvangen van de key up op de teksteditor, deze opent de dropdownlijst in het geval dat ''' de ingevoerde tekst overeenkomt met een item uit de dropdownlijst ''' Private Sub ComboEditorXD_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp If e.KeyCode = Keys.Enter _ OrElse e.KeyCode = Keys.Escape _ OrElse e.KeyCode = Keys.F4 _ OrElse e.KeyCode = Keys.Up _ OrElse e.KeyCode = Keys.Down _ OrElse e.KeyCode = Keys.Tab _ OrElse e.KeyCode = Keys.ShiftKey _ OrElse e.KeyCode = Keys.Delete _ OrElse e.KeyCode = Keys.Alt Then Return End If Try varComboGrid.Selected.Rows.Clear() Dim mvrRows As List(Of Object) = (From row In varComboGrid.Rows.All Where DirectCast(row, UltraGridRow).Cells(0).Value.ToString.ToLower.StartsWith(Me.Text.ToLower)).ToList If mvrRows.Count > 0 Then DirectCast(mvrRows(0), UltraGridRow).Selected = True DirectCast(mvrRows(0), UltraGridRow).Activate() varNewdropdowneditorbutton.DropDown() Else varNewdropdowneditorbutton.CloseUp() End If Catch 'bij het afsliuiten van het form kan het zijn dat de dataset al ge-disposed is maar de rest van het form niet, 'key events worden hier dan nog afgheandeld maar veroorzaken exceptions End Try End Sub ''' ''' Override van OnBeforeExitEditmode ''' ''' ''' Forceer een closeup zodat de lijst bij het verlaten van het control altijd wordt gesloten ''' Protected Overrides Sub OnBeforeExitEditMode(ByVal args As Infragistics.Win.BeforeExitEditModeEventArgs) MyBase.OnBeforeExitEditMode(args) varNewdropdowneditorbutton.CloseUp() End Sub ''' ''' Slecteer een item uit de lijst door een muis click ''' ''' De selectie vindt alleen plaats als de muis boven de geselecteerde rij staat Private Sub varComboGrid_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles varComboGrid.MouseUp 'selecteer het item onder de muis, de acrieve en geselecteeerde row zijn al ingesteld dus kunnnen we deze rechtstreeks overnemen ' Doe dit alleen als de muis boven de geselecteerde grid regel staat en niet op de header etc. If varComboGrid.Selected.Rows.Count > 0 Then Dim mvrSelectedRow As UltraGridRow = varComboGrid.Selected.Rows(0) Dim mvrMouseRect As New Rectangle(e.X, e.Y, 1, 1) If mvrSelectedRow.GetUIElement().Rect.IntersectsWith(mvrMouseRect) Then SetDisplayValue() End If End If End Sub End Class End Namespace