Files
ADMIN/SDL/VERAG_PROG_ALLGEMEIN/Benutzerdefinierte Steuerelemente/MyComboBox.vb
2021-09-07 10:55:23 +02:00

183 lines
6.5 KiB
VB.net

Imports System.ComponentModel
Public Class MyComboBox
Inherits System.Windows.Forms.ComboBox
Public Property _allowFreiText As Boolean = False
Public Property _allowedValuesFreiText As String() = Nothing
' Public Property _allowedValuesFreiText_SET As String() = Nothing
Public Sub New()
End Sub
Sub fillWithMyListItem(l As List(Of MyListItem), Optional firstEmpty As Boolean = False, Optional clearList As Boolean = True, Optional firstEmptyName As String = "")
If clearList Then MyBase.Items.Clear()
If firstEmpty Then
Me.Items.Insert(0, New MyListItem(firstEmptyName, ""))
End If
If l IsNot Nothing Then
For Each i In l : MyBase.Items.Add(i) : Next
End If
End Sub
Sub fillWithSQL(sqlstr As String, Optional showValueInText As Boolean = True, Optional conn As String = "SDL", Optional firstEmpty As Boolean = False, Optional clearList As Boolean = True, Optional firstEmptyName As String = "")
fillWithMyListItem((New SQL).loadCboBySqlWithListItem(sqlstr, showValueInText, conn), firstEmpty, clearList, firstEmptyName)
_TRANSLATE()
End Sub
Public Property _value As String
Get
Return getValueOfItem()
End Get
Set(v As String)
'If _allowedValuesFreiText Is Nothing OrElse Not valueAllowed(v) Then
If v = "" Then
If Me.Items.Count > 0 And Not _allowFreiText Then Me.SelectedItem = Me.Items(0)
Else
changeItem(v, valueAllowed(v))
'End If
End If
End Set
End Property
Function valueAllowed(t)
If _allowedValuesFreiText IsNot Nothing Then
For Each s In _allowedValuesFreiText
Try : If t.ToUpper = CStr(s).ToUpper Then Return True
Catch : End Try
Next
End If
Return False
End Function
Function changeItem(v, Optional Valueallowed = False) As Boolean
'
Try
If Me.Items.Count = 0 Then Me.Text = "" : Return True
If Me.Items(0).GetType.Name = "MyListItem" Then
Try : If DirectCast(Me.SelectedItem, MyListItem).Value.ToUpper = CStr(v).ToUpper Then Return True 'warum nochmal?
Catch : End Try ' Wenn der ausgewählte EIntrag bereits korrekt ist.
For Each i In Me.Items
' MsgBox(DirectCast(i, MyListItem).Value & " - " & v)
If DirectCast(i, MyListItem).Value.ToUpper = CStr(v).ToUpper Then
'me.SelectedIndex = i : Return True
Me.SelectedItem = i : Return True
End If
Next
For Each i In Me.Items
' MsgBox(DirectCast(i, MyListItem).Value & " - " & v)
If DirectCast(i, MyListItem).Text.ToUpper = CStr(v).ToUpper Then
Me.SelectedItem = i : Return True
End If
Next
Else
'WEnn die Items normale Strings beinhalten, wird keine Änderung des ._value Wertes vorgenommen.
Return True
End If
Catch ex As Exception
' MsgBox(ex.Message)
End Try
If Not _allowFreiText And Not Valueallowed Then
Me._value = ""
End If
If Valueallowed Then
Me.Text = v
End If
Return False
End Function
Function getValueOfItem() As String
If Me.Items.Count = 0 Then Return ""
Try : Return DirectCast(MyBase.SelectedItem, MyListItem).Value
Catch
Try : Return MyBase.SelectedItem.ToString : Catch : End Try
End Try
If _allowFreiText Or valueAllowed(Me.Text) Then Return Me.Text
Return ""
End Function
Private Sub MyComboBox_Leave(sender As Object, e As EventArgs) Handles Me.Leave
If Me.DropDownStyle = Windows.Forms.ComboBoxStyle.DropDown Then
If Me.Text = "" Then
If Me.Items.Count > 0 Then Me.SelectedItem = Me.Items(0)
End If
End If
Me._value = Me.Text
changeItem(CStr(Me.Text), valueAllowed(Me.Text))
Exit Sub
If valueAllowed(Me.Text) Then
Dim t = Me.Text
changeItem(CStr(t)) 'Wenn nicht schon in der Auswahl gefunden, dann wird _value gesetzt
Me._value = t
Else
If Me._value = "" And Me.Text <> "" Then
If Not changeItem(CStr(Me.Text)) And _allowFreiText Then
Me.Text = ""
If Me.Items.Count > 0 Then Me.SelectedItem = Me.Items(0)
Me._value = ""
End If
End If
End If
End Sub
Private Sub MyComboBox_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Me.SelectedIndexChanged
Me._value = getValueOfItem()
'Geht nicht, da sonst Auswahl nicht Funktioniert
' MsgBox(Me._value)
End Sub
Public Sub _TRANSLATE()
Try
If VERAG_PROG_ALLGEMEIN.cAllgemein._LAN = "" Then Exit Sub
If VERAG_PROG_ALLGEMEIN.cAllgemein._LAN = "DE" Then Exit Sub
Dim lanTxtAll = VERAG_PROG_ALLGEMEIN.cAllgemein.TRANSLATE.list.FindAll(Function(x) x.trs_object = Me.FindForm.Name And x.trs_control = Me.Name And x.trs_sprache = VERAG_PROG_ALLGEMEIN.cAllgemein._LAN)
If lanTxtAll.Count > 0 Then
Dim listItems(Me.Items.Count) As MyListItem
Me.Items.CopyTo(listItems, 0)
Me.Items.Clear()
For Each l In listItems
If l IsNot Nothing Then
Dim lanTxt = l.Text
For Each txt In lanTxtAll
If txt.trs_subControl IsNot DBNull.Value AndAlso txt.trs_subControl = l.Text Then
lanTxt = txt.trs_text
End If
Next
' Dim lanTxt = VERAG_PROG_ALLGEMEIN.cAllgemein.TRANSLATE.list.Find(Function(x) x.trs_object = Me.FindForm.Name And x.trs_control = Me.Name And x.trs_sprache = VERAG_PROG_ALLGEMEIN.cAllgemein._LAN And (x.trs_subControl IsNot DBNull.Value AndAlso x.trs_subControl = l.Text))
' MsgBox(If(lanTxt Is Nothing, "noth " & Me.Name, lanTxt.trs_text))
Me.Items.Add(New MyListItem(lanTxt, l.Value))
End If
Next
End If
Catch ex As Exception
MsgBox(ex.Message & ex.StackTrace)
End Try
End Sub
End Class