Files
AVISO/Aviso/frmEintragTvNew.vb
2024-12-09 17:43:40 +01:00

1074 lines
46 KiB
VB.net

Imports System.Data.SqlClient
Imports VERAG_PROG_ALLGEMEIN
Public Class frmEintragTvNew
Dim AvisoTvNewDAL As New cAvisoTvNewDAL()
Dim myAvisoTvNew As cAvisoTvNew
Dim hatAenderung As Boolean = False
Dim Neuanlage As Boolean = False
Dim list As New List(Of cAvisoTvNew)()
Dim listAll As New List(Of cAvisoTvNew)()
Private isInitializing As Boolean = False
' **Neue Klassenvariable zur Speicherung der zuletzt ausgewählten TVID**
Private lastSelectedTVID As Integer = 0
Public Sub New()
InitializeComponent()
InitializeFontComboBoxes()
Icon = cMeineFunktionenAVISO.GetProgrammIcon()
End Sub
Private Sub frmEintragTvNew_Load(sender As Object, e As EventArgs) Handles MyBase.Load
LadeStandorte()
' Erst alle Einträge laden, damit listAll bereits gefüllt ist
LadenAlleEintraege()
' Dann erst die Bezeichnungen laden
LadeTvTextBezeichnungen()
grpWochentage.Enabled = chkIsRecurring.Checked
dgvAVISOTV.SelectionMode = DataGridViewSelectionMode.FullRowSelect
dgvAVISOTV.MultiSelect = False
dtpStartDate.ShowCheckBox = True
dtpEndDate.ShowCheckBox = True
dtpStartTime.ShowCheckBox = True
dtpEndTime.ShowCheckBox = True
chkIsActive.Checked = True
End Sub
Private Sub LadenAlleEintraege()
Try
AvisoTvNewDAL.LesenAlleAvisoTvNew(listAll)
Catch ex As Exception
MessageBox.Show("Fehler beim Laden aller Einträge: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub LadeStandorte()
Dim standorte As New List(Of String)()
Try
Dim conn As SqlConnection = cDatenbankAVISO.GetNewOpenConnectionWithoutError()
If conn Is Nothing Then
MessageBox.Show("Die Datenbankverbindung konnte nicht hergestellt werden.", "Verbindungsfehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
Dim sql As String = "SELECT DISTINCT StandortBezeichnung FROM StandorteTV ORDER BY StandortBezeichnung"
Using cmd As New SqlCommand(sql, conn)
Using dr As SqlDataReader = cmd.ExecuteReader()
While dr.Read()
Dim standort As String = Convert.ToString(dr("StandortBezeichnung"))
standorte.Add(standort)
End While
End Using
End Using
Catch ex As SqlException
MessageBox.Show("SQL Fehler beim Laden der Standorte: " & ex.Message, "SQL Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch ex As Exception
MessageBox.Show("Allgemeiner Fehler beim Laden der Standorte: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
cbxStandort.Items.Clear()
cbxStandort.Items.AddRange(standorte.ToArray())
If cbxStandort.Items.Count > 0 Then cbxStandort.SelectedIndex = 0
End Sub
' Neue parameterlose initdgv-Methode
Private Sub initdgv()
Dim selectedStandort As String = If(cbxStandort.SelectedItem IsNot Nothing, cbxStandort.SelectedItem.ToString(), "")
initdgv(selectedStandort)
End Sub
Private Sub initdgv(selectedStandort As String)
Try
' Entfernen Sie vorhandene Event-Handler, um Doppelbindungen zu vermeiden
RemoveHandler dgvAVISOTV.SelectionChanged, AddressOf dgvAVISOTV_SelectionChanged
RemoveHandler dgvAVISOTV.CellFormatting, AddressOf dgvAVISOTV_CellFormatting
Dim standortID As Integer = AvisoTvNewDAL.GetStandortID(selectedStandort)
Dim showInactive As Boolean = chkShowInactive.Checked
Dim gefilterteListe As List(Of cAvisoTvNew)
If showInactive Then
gefilterteListe = list.Where(Function(x) x.StandortID = standortID).ToList()
Else
gefilterteListe = list.Where(Function(x) x.StandortID = standortID AndAlso x.IsActive).ToList()
End If
' Zurücksetzen der DataSource und Löschen der Zeilen
dgvAVISOTV.DataSource = Nothing
dgvAVISOTV.Rows.Clear()
If gefilterteListe.Count > 0 Then
dgvAVISOTV.DataSource = gefilterteListe
' Anpassen der Spaltenüberschriften und Sichtbarkeiten
ConfigureDataGridViewColumns()
AddFixeZeileTextColumns()
' Konvertieren von RTF-Inhalten zu reinem Text
ConvertRtfToPlainText()
dgvAVISOTV.AutoResizeColumns()
' Wiederhinzufügen der Event-Handler
AddHandler dgvAVISOTV.SelectionChanged, AddressOf dgvAVISOTV_SelectionChanged
' Wiederherstellung der Auswahl basierend auf lastSelectedTVID
RestoreSelection()
Else
' Wiederhinzufügen der Event-Handler
AddHandler dgvAVISOTV.SelectionChanged, AddressOf dgvAVISOTV_SelectionChanged
' Felder leeren und Auswahl zurücksetzen
ClearFields()
myAvisoTvNew = Nothing
End If
Neuanlage = False
hatAenderung = False
Catch ex As Exception
MessageBox.Show("Fehler beim Laden der Daten: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
' Neue Methode zum Konfigurieren der Spaltenüberschriften und Sichtbarkeiten
Private Sub ConfigureDataGridViewColumns()
' Anpassen der Spaltenüberschriften
Dim headerTexts As New Dictionary(Of String, String) From {
{"TvTextBezeichnungID", "ID"},
{"TvTextBezeichnung", "Bezeichnung"},
{"StartDate", "Startdatum"},
{"EndDate", "Enddatum"},
{"StartTime", "Startzeit"},
{"EndTime", "Endzeit"},
{"IsRecurring", "Wiederholen"},
{"IsActive", "Aktiv"}
}
For Each columnName As String In headerTexts.Keys
If dgvAVISOTV.Columns.Contains(columnName) Then
dgvAVISOTV.Columns(columnName).HeaderText = headerTexts(columnName)
End If
Next
' Verstecken der unnötigen Spalten
Dim columnsToHide As String() = {
"FixeZeile1RTF", "FixeZeile2RTF", "FixeZeile3RTF",
"Standort", "Art",
"IsMonday", "IsTuesday", "IsWednesday",
"IsThursday", "IsFriday", "IsSaturday", "IsSunday", "StandortID", "FixeZeile1HTML", "FixeZeile2HTML", "FixeZeile3HTML"
}
For Each columnName As String In columnsToHide
If dgvAVISOTV.Columns.Contains(columnName) Then
dgvAVISOTV.Columns(columnName).Visible = False
End If
Next
End Sub
Private Sub AddFixeZeileTextColumns()
Dim textColumns As New List(Of DataGridViewTextBoxColumn) From {
New DataGridViewTextBoxColumn() With {
.Name = "FixeZeile1Text",
.HeaderText = "Deutsch",
.ReadOnly = True
},
New DataGridViewTextBoxColumn() With {
.Name = "FixeZeile2Text",
.HeaderText = "Englisch",
.ReadOnly = True
},
New DataGridViewTextBoxColumn() With {
.Name = "FixeZeile3Text",
.HeaderText = "Türkisch",
.ReadOnly = True
}
}
For Each col As DataGridViewTextBoxColumn In textColumns
If Not dgvAVISOTV.Columns.Contains(col.Name) Then
dgvAVISOTV.Columns.Add(col)
End If
Next
End Sub
' Neue Methode zur Konvertierung von RTF zu reinem Text
Private Sub ConvertRtfToPlainText()
For Each row As DataGridViewRow In dgvAVISOTV.Rows
If Not row.IsNewRow Then
Dim rtfValue1 As String = If(row.Cells("FixeZeile1RTF").Value?.ToString(), String.Empty)
Dim rtfValue2 As String = If(row.Cells("FixeZeile2RTF").Value?.ToString(), String.Empty)
Dim rtfValue3 As String = If(row.Cells("FixeZeile3RTF").Value?.ToString(), String.Empty)
row.Cells("FixeZeile1Text").Value = RtfToPlainText(rtfValue1)
row.Cells("FixeZeile2Text").Value = RtfToPlainText(rtfValue2)
row.Cells("FixeZeile3Text").Value = RtfToPlainText(rtfValue3)
End If
Next
End Sub
' Neue Methode zur Wiederherstellung der Auswahl
Private Sub RestoreSelection()
If lastSelectedTVID <> 0 Then
Dim rowToSelect = dgvAVISOTV.Rows.Cast(Of DataGridViewRow)().FirstOrDefault(Function(r) CType(r.DataBoundItem, cAvisoTvNew).TvTextBezeichnungID = lastSelectedTVID)
If rowToSelect IsNot Nothing Then
rowToSelect.Selected = True
dgvAVISOTV.FirstDisplayedScrollingRowIndex = rowToSelect.Index
dgvAVISOTV.CurrentCell = rowToSelect.Cells(0)
Dim selectedAviso As cAvisoTvNew = listAll.FirstOrDefault(Function(x) x.TvTextBezeichnungID = lastSelectedTVID AndAlso x.IsActive)
FillFieldsFromAviso(selectedAviso)
Else
' Falls die TVID nicht gefunden wird, wähle die erste Zeile aus
SelectFirstRow()
End If
Else
' Wenn keine letzte Auswahl vorhanden ist, wähle die erste Zeile aus
If dgvAVISOTV.Rows.Count > 0 Then
SelectFirstRow()
End If
End If
lastSelectedTVID = 0
End Sub
' Hilfsmethode zum Auswählen der ersten Zeile
Private Sub SelectFirstRow()
If dgvAVISOTV.Rows.Count > 0 Then
dgvAVISOTV.Rows(0).Selected = True
dgvAVISOTV.CurrentCell = dgvAVISOTV.Rows(0).Cells(0)
dgvAVISOTV_SelectionChanged(Nothing, Nothing)
End If
End Sub
' Beispielhafte Implementierung der RtfToPlainText-Methode
Private Function RtfToPlainText(rtf As String) As String
If String.IsNullOrEmpty(rtf) Then Return String.Empty
Using rtb As New RichTextBox()
Try
rtb.Rtf = rtf
Return rtb.Text
Catch ex As Exception
' Handle invalid RTF format
Return String.Empty
End Try
End Using
End Function
Private Sub dgvAVISOTV_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs)
' Definieren Sie die Namen der RTF-Spalten
Dim rtfColumns As String() = {"FixeZeile1RTF", "FixeZeile2RTF", "FixeZeile3RTF"}
' Überprüfen Sie, ob die aktuelle Spalte eine der RTF-Spalten ist
If rtfColumns.Contains(dgvAVISOTV.Columns(e.ColumnIndex).Name) AndAlso e.Value IsNot Nothing Then
Try
' Konvertieren Sie den RTF-Text in normalen Text
Using rtb As New RichTextBox()
rtb.Rtf = e.Value.ToString()
e.Value = rtb.Text
e.FormattingApplied = True
End Using
Catch ex As Exception
' Falls das RTF ungültig ist, zeigen Sie den Originalwert an
e.Value = e.Value.ToString()
e.FormattingApplied = True
End Try
End If
End Sub
Private Sub cbxStandort_SelectedValueChanged(sender As Object, e As EventArgs) Handles cbxStandort.SelectedValueChanged
If list IsNot Nothing Then list.Clear()
Dim selectedStandort As String = If(cbxStandort.SelectedItem IsNot Nothing, cbxStandort.SelectedItem.ToString(), "")
Try
AvisoTvNewDAL.LesenAvisoTvNew(0, "", selectedStandort, list)
Catch ex As Exception
MessageBox.Show("Fehler beim Lesen der Einträge: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End Try
LadeTvTextBezeichnungen()
initdgv(selectedStandort)
End Sub
Private Sub btnOpenSettings_Click(sender As Object, e As EventArgs) Handles btnOpenSettings.Click
Dim currentStandort As String = cbxStandort.SelectedItem?.ToString()
Dim currentStandortID As Integer = 0
If Not String.IsNullOrEmpty(currentStandort) Then
currentStandortID = AvisoTvNewDAL.GetStandortID(currentStandort)
End If
If currentStandortID = 0 Then
MessageBox.Show("Bitte wählen Sie einen gültigen Standort aus.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
Dim settingsForm As New frmTvSettings(currentStandortID)
settingsForm.ShowDialog()
End Sub
Private Sub btnNeu_Click(sender As Object, e As EventArgs)
Dim standort As String = cbxStandort.SelectedItem?.ToString()
If String.IsNullOrEmpty(standort) Then
MessageBox.Show("Bitte wählen Sie einen Standort aus.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return
End If
Dim standortID As Integer = AvisoTvNewDAL.GetStandortID(standort)
If standortID = 0 Then
MessageBox.Show("Ungültiger Standort ausgewählt.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
myAvisoTvNew = New cAvisoTvNew() With {
.StandortID = standortID,
.Standort = standort,
.Art = "",
.IsActive = True
}
cmbTvTextBezeichnungAuswahl.SelectedIndex = -1
txtNeueTvTextBezeichnung.Text = ""
Neuanlage = True
hatAenderung = False
Me.Text = "Neuen Eintrag hinzufügen"
End Sub
Public Class ComboBoxItem
Public Property ID As Integer
Public Property DisplayText As String
Public Overrides Function ToString() As String
Return DisplayText
End Function
End Class
Private Sub cmbTvTextBezeichnungAuswahl_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbTvTextBezeichnungAuswahl.SelectedIndexChanged
If isInitializing OrElse cmbTvTextBezeichnungAuswahl.SelectedIndex = -1 Then
Return
End If
If listAll Is Nothing OrElse Not listAll.Any() Then
MessageBox.Show("Die Liste aller AvisoEinträge ist nicht geladen oder leer.", "Datenfehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
Try
Dim selectedTvTextBezeichnungID As Integer
Try
selectedTvTextBezeichnungID = Convert.ToInt32(cmbTvTextBezeichnungAuswahl.SelectedValue)
Debug.WriteLine("Selected TvTextBezeichnungID: " & selectedTvTextBezeichnungID)
Catch ex As Exception
MessageBox.Show("Ungültiger Wert für TvTextBezeichnungID: " & ex.Message, "Konvertierungsfehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End Try
If listAll Is Nothing OrElse Not listAll.Any() Then
MessageBox.Show("Die Liste aller AvisoEinträge ist nicht geladen oder leer.", "Datenfehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
Dim selectedAviso As cAvisoTvNew = listAll.FirstOrDefault(Function(x) x.TvTextBezeichnungID = selectedTvTextBezeichnungID AndAlso x.IsActive)
Dim currentStandort As String = cbxStandort.SelectedItem?.ToString()
Dim currentStandortID As Integer = AvisoTvNewDAL.GetStandortID(currentStandort)
If selectedAviso IsNot Nothing Then
Debug.WriteLine("Gefundenes Aviso: TVID = " & selectedAviso.TvTextBezeichnungID)
myAvisoTvNew = selectedAviso
Neuanlage = False
FillFieldsFromAviso(selectedAviso)
Me.Text = "Eintrag bearbeiten"
txtNeueTvTextBezeichnung.Text = ""
Else
Debug.WriteLine("Kein bestehender Eintrag gefunden. Neuer Eintrag wird erstellt.")
myAvisoTvNew = New cAvisoTvNew() With {
.IsActive = True,
.StandortID = currentStandortID,
.Standort = currentStandort
}
Neuanlage = True
Me.Text = "Neuen Eintrag hinzufügen"
End If
Catch ex As InvalidCastException
MessageBox.Show("Fehler beim Konvertieren der TvTextBezeichnungID: " & ex.Message, "Konvertierungsfehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Catch ex As Exception
MessageBox.Show("Ein unerwarteter Fehler ist aufgetreten: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub tabControlZeilen_SelectedIndexChanged(sender As Object, e As EventArgs) Handles tabControlZeilen.SelectedIndexChanged
InitializeFontComboBoxes()
End Sub
Private Sub InitializeFontComboBoxes()
Try
isInitializing = True
' Schritt 1: Font-Familien sammeln
Dim fontFamilies As New List(Of String)()
For Each font As FontFamily In FontFamily.Families
fontFamilies.Add(font.Name)
Next
' Schritt 2: cmbFontFamily initialisieren
cmbFontFamily.Items.Clear()
cmbFontFamily.Items.AddRange(fontFamilies.ToArray())
' Schritt 3: Schriftgrößen sammeln
Dim sizes As Integer() = {8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72}
cmbFontSize.Items.Clear()
cmbFontSize.Items.AddRange(sizes.Select(Function(s) s.ToString()).ToArray())
' Schritt 4: Aktuelle Schriftfamilie und Schriftgröße aus der RichTextBox lesen
If AktuelleRichTextBox IsNot Nothing Then
Dim selectedFont As Font = AktuelleRichTextBox.SelectionFont
If selectedFont IsNot Nothing Then
' Setze die Schriftfamilie
If fontFamilies.Contains(selectedFont.FontFamily.Name) Then
cmbFontFamily.SelectedItem = selectedFont.FontFamily.Name
ElseIf cmbFontFamily.Items.Count > 0 Then
cmbFontFamily.SelectedIndex = 0 ' Standard auf erste Schriftart setzen
End If
' Setze die Schriftgröße
Dim fontSizeInt As Integer = CInt(Math.Round(selectedFont.Size))
Dim fontSizeStr As String = fontSizeInt.ToString()
If cmbFontSize.Items.Contains(fontSizeStr) Then
cmbFontSize.SelectedItem = fontSizeStr
ElseIf cmbFontSize.Items.Count > 0 Then
cmbFontSize.SelectedItem = "12" ' Standard auf 12 setzen
End If
Else
' Falls keine spezifische Schrift ausgewählt ist, setze Standardwerte
If cmbFontFamily.Items.Count > 0 Then
cmbFontFamily.SelectedIndex = 0
End If
If cmbFontSize.Items.Count > 0 Then
cmbFontSize.SelectedItem = "12"
End If
End If
Else
' Falls AktuelleRichTextBox nicht gesetzt ist, setze Standardwerte
If cmbFontFamily.Items.Count > 0 Then
cmbFontFamily.SelectedIndex = 0
End If
If cmbFontSize.Items.Count > 0 Then
cmbFontSize.SelectedItem = "12"
End If
End If
' Schritt 5: Event-Handler aktualisieren
' Entferne alte Event-Handler, um Doppelbindungen zu vermeiden
RemoveHandler cmbFontFamily.SelectedIndexChanged, AddressOf cmbFontFamily_SelectedIndexChanged
RemoveHandler cmbFontSize.SelectedIndexChanged, AddressOf cmbFontSize_SelectedIndexChanged
' Füge neue Event-Handler hinzu
AddHandler cmbFontFamily.SelectedIndexChanged, AddressOf cmbFontFamily_SelectedIndexChanged
AddHandler cmbFontSize.SelectedIndexChanged, AddressOf cmbFontSize_SelectedIndexChanged
isInitializing = False
Catch ex As Exception
MessageBox.Show("Fehler beim Initialisieren der Schriftart-ComboBoxes: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
isInitializing = False
End Try
End Sub
' Schriftfamilie ComboBox SelectionChanged
Private Sub cmbFontFamily_SelectedIndexChanged(sender As Object, e As EventArgs)
If isInitializing Then Return
UpdateFont()
End Sub
' Schriftgröße ComboBox SelectionChanged
Private Sub cmbFontSize_SelectedIndexChanged(sender As Object, e As EventArgs)
If isInitializing Then Return
UpdateFont()
End Sub
Private Sub UpdateFont()
If isInitializing Then Return
' Nur anwenden, wenn tatsächlich etwas markiert ist
If AktuelleRichTextBox.SelectionLength <= 0 Then
Return
End If
Dim selectedFontFamily As String = If(cmbFontFamily.SelectedItem, AktuelleRichTextBox.SelectionFont?.FontFamily.Name)
Dim selectedFontSize As Single
If Single.TryParse(cmbFontSize.SelectedItem, selectedFontSize) Then
' Erstellen einer neuen Schriftart basierend auf der Auswahl
Dim currentFont As Font = AktuelleRichTextBox.SelectionFont
If currentFont IsNot Nothing Then
AktuelleRichTextBox.SelectionFont = New Font(selectedFontFamily, selectedFontSize, currentFont.Style)
Else
' Wenn die Auswahl unterschiedliche Schriftarten hat, eine neue Schriftart setzen
AktuelleRichTextBox.SelectionFont = New Font(selectedFontFamily, selectedFontSize)
End If
hatAenderung = True
End If
End Sub
Private Sub btnBold_Click(sender As Object, e As EventArgs) Handles btnBold.Click
If isInitializing Then Return
ToggleFontStyle(FontStyle.Bold)
End Sub
Private Sub btnItalic_Click(sender As Object, e As EventArgs) Handles btnItalic.Click
If isInitializing Then Return
ToggleFontStyle(FontStyle.Italic)
End Sub
Private Sub btnUnderline_Click(sender As Object, e As EventArgs) Handles btnUnderline.Click
If isInitializing Then Return
ToggleFontStyle(FontStyle.Underline)
End Sub
Private Sub btnTextColor_Click(sender As Object, e As EventArgs) Handles btnTextColor.Click
' Nur anwenden, wenn tatsächlich etwas markiert ist
If AktuelleRichTextBox.SelectionLength <= 0 Then
Return
End If
If colorDialogText.ShowDialog() = DialogResult.OK Then
AktuelleRichTextBox.SelectionColor = colorDialogText.Color
End If
End Sub
Private Sub btnBackColor_Click(sender As Object, e As EventArgs) Handles btnBackColor.Click
' Nur anwenden, wenn tatsächlich etwas markiert ist
If AktuelleRichTextBox.SelectionLength <= 0 Then
Return
End If
If colorDialogText.ShowDialog() = DialogResult.OK Then
AktuelleRichTextBox.SelectionBackColor = colorDialogText.Color
End If
End Sub
Private Sub btnAlignLeft_Click(sender As Object, e As EventArgs) Handles btnAlignLeft.Click
If isInitializing Then Return
' Nur anwenden, wenn tatsächlich etwas markiert ist
If AktuelleRichTextBox.SelectionLength <= 0 Then
Return
End If
AktuelleRichTextBox.SelectionAlignment = HorizontalAlignment.Left
End Sub
Private Sub btnAlignCenter_Click(sender As Object, e As EventArgs) Handles btnAlignCenter.Click
If isInitializing Then Return
' Nur anwenden, wenn tatsächlich etwas markiert ist
If AktuelleRichTextBox.SelectionLength <= 0 Then
Return
End If
AktuelleRichTextBox.SelectionAlignment = HorizontalAlignment.Center
End Sub
Private Sub btnAlignRight_Click(sender As Object, e As EventArgs) Handles btnAlignRight.Click
If isInitializing Then Return
' Nur anwenden, wenn tatsächlich etwas markiert ist
If AktuelleRichTextBox.SelectionLength <= 0 Then
Return
End If
AktuelleRichTextBox.SelectionAlignment = HorizontalAlignment.Right
End Sub
Private Sub ToggleFontStyle(style As FontStyle)
If isInitializing Then Return
' Nur anwenden, wenn tatsächlich etwas markiert ist
If AktuelleRichTextBox.SelectionLength <= 0 Then
Return
End If
If AktuelleRichTextBox.SelectionFont IsNot Nothing Then
Dim currentFont As Font = AktuelleRichTextBox.SelectionFont
Dim newFontStyle As FontStyle
If AktuelleRichTextBox.SelectionFont.Style.HasFlag(style) Then
' Entferne den Stil
newFontStyle = currentFont.Style And Not style
Else
' Füge den Stil hinzu
newFontStyle = currentFont.Style Or style
End If
' Setze die neue Schriftart
AktuelleRichTextBox.SelectionFont = New Font(currentFont.FontFamily, currentFont.Size, newFontStyle)
hatAenderung = True
End If
End Sub
Private Sub LadeTvTextBezeichnungen()
isInitializing = True
' Event-Handler entfernen, um zu verhindern, dass SelectedIndexChanged zu früh feuert
RemoveHandler cmbTvTextBezeichnungAuswahl.SelectedIndexChanged, AddressOf cmbTvTextBezeichnungAuswahl_SelectedIndexChanged
Dim bezeichnungen As New List(Of cTvTextBezeichnung)()
Try
bezeichnungen = AvisoTvNewDAL.LadenAlleTvTextBezeichnungen()
Catch ex As Exception
MessageBox.Show("Fehler beim Laden der TvTextBezeichnungen: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
isInitializing = False
' Event-Handler wieder hinzufügen, bevor wir verlassen
AddHandler cmbTvTextBezeichnungAuswahl.SelectedIndexChanged, AddressOf cmbTvTextBezeichnungAuswahl_SelectedIndexChanged
Return
End Try
Dim items As New List(Of ComboBoxItem)()
For Each bezeichnung In bezeichnungen
items.Add(New ComboBoxItem() With {
.ID = bezeichnung.TvTextBezeichnungID,
.DisplayText = bezeichnung.TvTextBezeichnung
})
Next
cmbTvTextBezeichnungAuswahl.DataSource = Nothing
cmbTvTextBezeichnungAuswahl.DataSource = items
cmbTvTextBezeichnungAuswahl.DisplayMember = "DisplayText"
cmbTvTextBezeichnungAuswahl.ValueMember = "ID"
cmbTvTextBezeichnungAuswahl.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
cmbTvTextBezeichnungAuswahl.SelectedIndex = -1
cmbPosition.SelectedIndex = -1
isInitializing = False
' Event-Handler jetzt, nachdem alles fertig ist, wieder hinzufügen
AddHandler cmbTvTextBezeichnungAuswahl.SelectedIndexChanged, AddressOf cmbTvTextBezeichnungAuswahl_SelectedIndexChanged
End Sub
Private Sub txtNeueTvTextBezeichnung_TextChanged(sender As Object, e As EventArgs) Handles txtNeueTvTextBezeichnung.TextChanged
If Not String.IsNullOrWhiteSpace(txtNeueTvTextBezeichnung.Text) Then
cmbTvTextBezeichnungAuswahl.SelectedIndex = -1
myAvisoTvNew = New cAvisoTvNew() With {
.TvTextBezeichnung = txtNeueTvTextBezeichnung.Text.Trim(),
.IsActive = True
}
Neuanlage = True
Me.Text = "Neuen Eintrag hinzufügen"
End If
End Sub
Private Sub FillFieldsFromAviso(ByVal aviso As cAvisoTvNew)
cmbTvTextBezeichnungAuswahl.SelectedValue = aviso.TvTextBezeichnungID
If Not String.IsNullOrEmpty(aviso.Position) Then
cmbPosition.SelectedItem = aviso.Position
Else
cmbPosition.SelectedIndex = -1
End If
txtNeueTvTextBezeichnung.Text = ""
' Hier setzt du die Textzeilen, wenn vorhanden
rtbZeile1.Rtf = aviso.FixeZeile1RTF
rtbZeile2.Rtf = aviso.FixeZeile2RTF
rtbZeile3.Rtf = aviso.FixeZeile3RTF
chkIsRecurring.Checked = aviso.IsRecurring.GetValueOrDefault(False)
If aviso.StartDate.HasValue Then
dtpStartDate.Value = aviso.StartDate.Value
dtpStartDate.Checked = True
Else
dtpStartDate.Value = DateTime.Now
dtpStartDate.Checked = False
End If
If aviso.EndDate.HasValue Then
dtpEndDate.Value = aviso.EndDate.Value
dtpEndDate.Checked = True
Else
dtpEndDate.Value = DateTime.Now
dtpEndDate.Checked = False
End If
If aviso.StartTime.HasValue Then
dtpStartTime.Value = DateTime.Today.Add(aviso.StartTime.Value)
dtpStartTime.Checked = True
Else
dtpStartTime.Value = DateTime.Now
dtpStartTime.Checked = False
End If
If aviso.EndTime.HasValue Then
dtpEndTime.Value = DateTime.Today.Add(aviso.EndTime.Value)
dtpEndTime.Checked = True
Else
dtpEndTime.Value = DateTime.Now
dtpEndTime.Checked = False
End If
chkMonday.Checked = aviso.IsMonday.GetValueOrDefault(False)
chkTuesday.Checked = aviso.IsTuesday.GetValueOrDefault(False)
chkWednesday.Checked = aviso.IsWednesday.GetValueOrDefault(False)
chkThursday.Checked = aviso.IsThursday.GetValueOrDefault(False)
chkFriday.Checked = aviso.IsFriday.GetValueOrDefault(False)
chkSaturday.Checked = aviso.IsSaturday.GetValueOrDefault(False)
chkSunday.Checked = aviso.IsSunday.GetValueOrDefault(False)
chkIsActive.Checked = aviso.IsActive
grpWochentage.Enabled = chkIsRecurring.Checked
End Sub
Private Function ConvertRtfToHtml(rtf As String) As String
Using rtb As New RichTextBox()
rtb.Rtf = rtf
Dim sb As New System.Text.StringBuilder()
Dim defaultFont As System.Drawing.Font = rtb.Font
Dim totalLength As Integer = rtb.TextLength
Dim charIndex As Integer = 0
While charIndex < totalLength
' Wähle das aktuelle Zeichen aus
rtb.Select(charIndex, 1)
' Hole die Formatierung des aktuellen Zeichens
Dim startFont As System.Drawing.Font = rtb.SelectionFont
Dim startColor As Color = rtb.SelectionColor
Dim startBackColor As Color = rtb.SelectionBackColor
Dim startAlignment As HorizontalAlignment = rtb.SelectionAlignment
If startFont Is Nothing Then
startFont = defaultFont
End If
' Initialisiere die Lauf-Länge
Dim runLength As Integer = 1
' Finde die Länge des Laufs
While (charIndex + runLength < totalLength)
rtb.Select(charIndex + runLength, 1)
Dim currentFont As System.Drawing.Font = rtb.SelectionFont
Dim currentColor As Color = rtb.SelectionColor
Dim currentBackColor As Color = rtb.SelectionBackColor
Dim currentAlignment As HorizontalAlignment = rtb.SelectionAlignment
If currentFont Is Nothing Then
currentFont = defaultFont
End If
' Überprüfe, ob die Formatierung gleich ist
If Not FontsAreEqual(startFont, currentFont) OrElse
startColor <> currentColor OrElse
startBackColor <> currentBackColor OrElse
startAlignment <> currentAlignment Then
Exit While
End If
runLength += 1
End While
' Hole den Text des Laufs
Dim runText As String = rtb.Text.Substring(charIndex, runLength)
Dim style As New System.Text.StringBuilder()
Select Case startAlignment
Case HorizontalAlignment.Left
' nichts hinzufügen, da Standard
Case HorizontalAlignment.Center
style.Append("text-align:center;")
Case HorizontalAlignment.Right
style.Append("text-align:right;")
End Select
If startFont IsNot Nothing Then
style.Append($"font-family:{startFont.FontFamily.Name};")
style.Append($"font-size:{startFont.SizeInPoints}pt;")
If startFont.Bold Then
style.Append("font-weight:bold;")
End If
If startFont.Italic Then
style.Append("font-style:italic;")
End If
If startFont.Underline Then
style.Append("text-decoration:underline;")
End If
End If
If startColor <> Color.Empty Then
style.Append($"color:{ColorTranslator.ToHtml(startColor)};")
End If
If startBackColor <> Color.Empty Then
style.Append($"background-color:{ColorTranslator.ToHtml(startBackColor)};")
End If
If style.Length > 0 Then
sb.Append($"<div style=""{style.ToString()}"">")
Else
sb.Append("<div>")
End If
Dim encodedText As String = System.Net.WebUtility.HtmlEncode(runText)
sb.Append(encodedText)
sb.Append("</div>")
charIndex += runLength
End While
Return sb.ToString()
End Using
End Function
Private Function FontsAreEqual(font1 As System.Drawing.Font, font2 As System.Drawing.Font) As Boolean
Return font1.FontFamily.Name = font2.FontFamily.Name AndAlso
font1.SizeInPoints = font2.SizeInPoints AndAlso
font1.Style = font2.Style
End Function
Private Sub btnSpeichern_Click(sender As Object, e As EventArgs) Handles btnSpeichern.Click
Dim verwendeteTvTextBezeichnung As String = ""
Dim isNeueTvTextBezeichnung As Boolean = False
Dim currentStandort As String = cbxStandort.SelectedItem?.ToString()
Dim currentStandortID As Integer = 0
If Not String.IsNullOrEmpty(currentStandort) Then
currentStandortID = AvisoTvNewDAL.GetStandortID(currentStandort)
End If
If currentStandortID = 0 Then
MessageBox.Show("Ungültiger Standort ausgewählt.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return
End If
Dim selectedTvTextBezeichnungID As Integer = 0
If cmbTvTextBezeichnungAuswahl.SelectedIndex >= 0 AndAlso String.IsNullOrWhiteSpace(txtNeueTvTextBezeichnung.Text) Then
verwendeteTvTextBezeichnung = cmbTvTextBezeichnungAuswahl.Text
selectedTvTextBezeichnungID = Convert.ToInt32(cmbTvTextBezeichnungAuswahl.SelectedValue)
ElseIf Not String.IsNullOrWhiteSpace(txtNeueTvTextBezeichnung.Text) Then
verwendeteTvTextBezeichnung = txtNeueTvTextBezeichnung.Text.Trim()
isNeueTvTextBezeichnung = True
Else
MessageBox.Show("Bitte wählen Sie eine TvTextBezeichnung aus oder geben Sie eine neue TvTextBezeichnung ein.", "Eingabefehler", MessageBoxButtons.OK, MessageBoxIcon.Warning)
cmbTvTextBezeichnungAuswahl.Focus()
Exit Sub
End If
Try
' **Speichern der TVID der aktuell ausgewählten Zeile**
If dgvAVISOTV.CurrentRow IsNot Nothing AndAlso dgvAVISOTV.CurrentRow.DataBoundItem IsNot Nothing Then
Dim selectedAviso As cAvisoTvNew = CType(dgvAVISOTV.CurrentRow.DataBoundItem, cAvisoTvNew)
If selectedAviso IsNot Nothing Then
lastSelectedTVID = selectedAviso.TvTextBezeichnungID
End If
End If
' Konvertiere RTF zu HTML
Dim rtfContent As String = rtbZeile1.Rtf
Dim htmlContent As String = ConvertRtfToHtml(rtfContent)
Dim rtfContent2 As String = rtbZeile2.Rtf
Dim htmlContent2 As String = ConvertRtfToHtml(rtfContent2)
Dim rtfContent3 As String = rtbZeile3.Rtf
Dim htmlContent3 As String = ConvertRtfToHtml(rtfContent3)
myAvisoTvNew.TvTextBezeichnung = verwendeteTvTextBezeichnung
myAvisoTvNew.StandortID = currentStandortID
If cmbPosition.SelectedIndex >= 0 Then
myAvisoTvNew.Position = cmbPosition.SelectedItem.ToString()
Else
myAvisoTvNew.Position = Nothing
End If
If isNeueTvTextBezeichnung Then
If AvisoTvNewDAL.IstTvTextBezeichnungVorhanden(myAvisoTvNew.TvTextBezeichnung) Then
MessageBox.Show("Die TvTextBezeichnung ist vorhanden. Bitte wählen Sie eine eindeutige TvTextBezeichnung.", "Eingabefehler", MessageBoxButtons.OK, MessageBoxIcon.Warning)
txtNeueTvTextBezeichnung.Focus()
Exit Sub
End If
Else
myAvisoTvNew.TvTextBezeichnungID = selectedTvTextBezeichnungID
End If
' Speichere den HTML-Inhalt
myAvisoTvNew.FixeZeile1RTF = If(String.IsNullOrWhiteSpace(rtbZeile1.Text), Nothing, rtfContent)
myAvisoTvNew.FixeZeile1HTML = If(String.IsNullOrWhiteSpace(rtbZeile1.Text), Nothing, htmlContent)
myAvisoTvNew.FixeZeile2RTF = If(String.IsNullOrWhiteSpace(rtbZeile2.Text), Nothing, rtfContent2)
myAvisoTvNew.FixeZeile2HTML = If(String.IsNullOrWhiteSpace(rtbZeile2.Text), Nothing, htmlContent2)
myAvisoTvNew.FixeZeile3RTF = If(String.IsNullOrWhiteSpace(rtbZeile3.Text), Nothing, rtfContent3)
myAvisoTvNew.FixeZeile3HTML = If(String.IsNullOrWhiteSpace(rtbZeile3.Text), Nothing, htmlContent3)
myAvisoTvNew.IsRecurring = chkIsRecurring.Checked
myAvisoTvNew.StartDate = If(dtpStartDate.Checked, CType(dtpStartDate.Value.Date, Date?), Nothing)
myAvisoTvNew.EndDate = If(dtpEndDate.Checked, CType(dtpEndDate.Value.Date, Date?), Nothing)
myAvisoTvNew.StartTime = If(dtpStartTime.Checked, CType(dtpStartTime.Value.TimeOfDay, TimeSpan?), Nothing)
myAvisoTvNew.EndTime = If(dtpEndTime.Checked, CType(dtpEndTime.Value.TimeOfDay, TimeSpan?), Nothing)
myAvisoTvNew.IsMonday = chkMonday.Checked
myAvisoTvNew.IsTuesday = chkTuesday.Checked
myAvisoTvNew.IsWednesday = chkWednesday.Checked
myAvisoTvNew.IsThursday = chkThursday.Checked
myAvisoTvNew.IsFriday = chkFriday.Checked
myAvisoTvNew.IsSaturday = chkSaturday.Checked
myAvisoTvNew.IsSunday = chkSunday.Checked
myAvisoTvNew.IsActive = chkIsActive.Checked
If Neuanlage Then
myAvisoTvNew.Standort = cbxStandort.SelectedItem?.ToString()
If String.IsNullOrEmpty(myAvisoTvNew.Standort) Then
MessageBox.Show("Bitte wählen Sie einen Standort aus.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Return
End If
End If
Debug.WriteLine($"Speichern: TVID = {myAvisoTvNew.TvTextBezeichnungID}, TvTextBezeichnungID = {myAvisoTvNew.TvTextBezeichnungID}, StandortID = {myAvisoTvNew.StandortID}")
' Speichern der Einstellungen
AvisoTvNewDAL.SpeichernAvisoTvNew(myAvisoTvNew)
LadeTvTextBezeichnungen()
list.Clear()
AvisoTvNewDAL.LesenAvisoTvNew(0, "", currentStandort, list)
' Nach dem Speichern und Neuladen der Daten
initdgv()
hatAenderung = False
If isNeueTvTextBezeichnung Then
' Setze lastSelectedTVID auf die TVID des neuen Eintrags
lastSelectedTVID = myAvisoTvNew.TvTextBezeichnungID
MessageBox.Show("Die neue TvTextBezeichnung wurde erfolgreich gespeichert.", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information)
cmbTvTextBezeichnungAuswahl.SelectedValue = myAvisoTvNew.TvTextBezeichnungID
txtNeueTvTextBezeichnung.Text = ""
Else
MessageBox.Show("Die Änderungen wurden erfolgreich gespeichert.", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
Catch ex As Exception
MessageBox.Show("Fehler beim Speichern der Daten: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Sub btnLoeschen_Click(sender As Object, e As EventArgs) Handles btnLoeschen.Click
If myAvisoTvNew Is Nothing OrElse myAvisoTvNew.TvTextBezeichnungID = 0 Then
MessageBox.Show("Bitte wählen Sie einen Eintrag zum Deaktivieren aus.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Return
End If
Dim antwort As DialogResult = MessageBox.Show("Möchten Sie den ausgewählten Eintrag wirklich deaktivieren?", "Deaktivieren bestätigen", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
If antwort = DialogResult.Yes Then
Try
AvisoTvNewDAL.SetzeAufInaktiv(myAvisoTvNew.TvTextBezeichnungID)
list.Clear()
AvisoTvNewDAL.LesenAvisoTvNew(0, "", cbxStandort.SelectedItem?.ToString(), list)
initdgv() ' Verwende jetzt die parameterlose Methode
ClearFields()
myAvisoTvNew = Nothing
Neuanlage = False
hatAenderung = False
MessageBox.Show("Der Eintrag wurde erfolgreich deaktiviert.", "Erfolg", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch ex As Exception
MessageBox.Show("Fehler beim Deaktivieren des Eintrags: " & ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If
End Sub
Private Sub dgvAVISOTV_SelectionChanged(sender As Object, e As EventArgs) Handles dgvAVISOTV.SelectionChanged
If dgvAVISOTV.CurrentRow IsNot Nothing AndAlso dgvAVISOTV.CurrentRow.DataBoundItem IsNot Nothing Then
Dim selectedAviso As cAvisoTvNew = CType(dgvAVISOTV.CurrentRow.DataBoundItem, cAvisoTvNew)
If selectedAviso IsNot Nothing Then
myAvisoTvNew = selectedAviso
FillFieldsFromAviso(selectedAviso)
Neuanlage = False
hatAenderung = False
Me.Text = "Eintrag bearbeiten"
End If
End If
End Sub
Private Sub btnAbbrechen_Click(sender As Object, e As EventArgs) Handles btnAbbrechen.Click
If hatAenderung Then
Dim antwort As DialogResult = MessageBox.Show("Es liegen ungespeicherte Änderungen vor. Möchten Sie das Fenster trotzdem schließen?", "Ungespeicherte Änderungen", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
If antwort = DialogResult.No Then Exit Sub
End If
Me.Close()
End Sub
Private Sub txt_TextChanged(sender As Object, e As EventArgs) Handles rtbZeile1.TextChanged, dtpStartDate.ValueChanged, dtpEndDate.ValueChanged, dtpStartTime.ValueChanged, dtpEndTime.ValueChanged, chkIsRecurring.CheckedChanged, chkMonday.CheckedChanged, chkTuesday.CheckedChanged, chkWednesday.CheckedChanged, chkThursday.CheckedChanged, chkFriday.CheckedChanged, chkSaturday.CheckedChanged, chkSunday.CheckedChanged, chkIsActive.CheckedChanged, cmbTvTextBezeichnungAuswahl.SelectedIndexChanged, txtNeueTvTextBezeichnung.TextChanged
hatAenderung = True
End Sub
Private Sub frmEintragTvNew_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
If hatAenderung Then
Dim antwort As DialogResult = MessageBox.Show("Es liegen ungespeicherte Änderungen vor. Möchten Sie das Fenster trotzdem schließen?", "Ungespeicherte Änderungen", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
If antwort = DialogResult.No Then e.Cancel = True
End If
End Sub
Private Sub chkIsRecurring_CheckedChanged(sender As Object, e As EventArgs) Handles chkIsRecurring.CheckedChanged
grpWochentage.Enabled = chkIsRecurring.Checked
End Sub
Private ReadOnly Property AktuelleRichTextBox As RichTextBox
Get
Select Case tabControlZeilen.SelectedIndex
Case 0
Return rtbZeile1
Case 1
Return rtbZeile2
Case 2
Return rtbZeile3
Case Else
Return rtbZeile1
End Select
End Get
End Property
Private Sub ClearFields()
cmbTvTextBezeichnungAuswahl.SelectedIndex = -1
cmbPosition.SelectedIndex = -1
txtNeueTvTextBezeichnung.Text = ""
rtbZeile1.Text = ""
rtbZeile2.Text = ""
rtbZeile3.Text = ""
dtpStartDate.Value = DateTime.Now
dtpStartDate.Checked = False
dtpEndDate.Value = DateTime.Now
dtpEndDate.Checked = False
dtpStartTime.Value = DateTime.Now
dtpStartTime.Checked = False
dtpEndTime.Value = DateTime.Now
dtpEndTime.Checked = False
chkIsRecurring.Checked = False
chkMonday.Checked = False
chkTuesday.Checked = False
chkWednesday.Checked = False
chkThursday.Checked = False
chkFriday.Checked = False
chkSaturday.Checked = False
chkSunday.Checked = False
chkIsActive.Checked = True
grpWochentage.Enabled = False
End Sub
Private Sub chkShowInactive_CheckedChanged_1(sender As Object, e As EventArgs) Handles chkShowInactive.CheckedChanged
initdgv()
End Sub
End Class