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