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() LadeTvTextBezeichnungen() LadenAlleEintraege() 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 Standort FROM StandorteTV ORDER BY Standort" Using cmd As New SqlCommand(sql, conn) Using dr As SqlDataReader = cmd.ExecuteReader() While dr.Read() Dim standort As String = Convert.ToString(dr("Standort")) 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 Private Sub initdgv() Try RemoveHandler dgvAVISOTV.SelectionChanged, AddressOf dgvAVISOTV_SelectionChanged Dim standort As String = cbxStandort.SelectedItem?.ToString() Dim showInactive As Boolean = chkShowInactive.Checked Dim gefilterteListe As List(Of cAvisoTvNew) If showInactive Then gefilterteListe = list.Where(Function(x) x.Standort = standort).ToList() Else gefilterteListe = list.Where(Function(x) x.Standort = standort AndAlso x.IsActive).ToList() End If dgvAVISOTV.DataSource = Nothing dgvAVISOTV.Rows.Clear() If gefilterteListe.Count > 0 Then dgvAVISOTV.DataSource = gefilterteListe ' Anpassen der Spaltenüberschriften dgvAVISOTV.Columns("TvTextBezeichnungID").HeaderText = "ID" dgvAVISOTV.Columns("TvTextBezeichnung").HeaderText = "Bezeichnung" dgvAVISOTV.Columns("FixeZeile1RTF").HeaderText = "Zeile 1 (Text)" dgvAVISOTV.Columns("FixeZeile2RTF").HeaderText = "Zeile 2 (Text)" dgvAVISOTV.Columns("FixeZeile3RTF").HeaderText = "Zeile 3 (Text)" dgvAVISOTV.Columns("Standort").Visible = False dgvAVISOTV.Columns("Art").Visible = False dgvAVISOTV.Columns("StartDate").HeaderText = "Startdatum" dgvAVISOTV.Columns("EndDate").HeaderText = "Enddatum" dgvAVISOTV.Columns("StartTime").HeaderText = "Startzeit" dgvAVISOTV.Columns("EndTime").HeaderText = "Endzeit" dgvAVISOTV.Columns("IsRecurring").HeaderText = "Wiederholen" dgvAVISOTV.Columns("IsActive").HeaderText = "Aktiv" dgvAVISOTV.Columns("IsMonday").Visible = False dgvAVISOTV.Columns("IsTuesday").Visible = False dgvAVISOTV.Columns("IsWednesday").Visible = False dgvAVISOTV.Columns("IsThursday").Visible = False dgvAVISOTV.Columns("IsFriday").Visible = False dgvAVISOTV.Columns("IsSaturday").Visible = False dgvAVISOTV.Columns("IsSunday").Visible = False ' Hinzufügen des CellFormatting-Handlers AddHandler dgvAVISOTV.CellFormatting, AddressOf dgvAVISOTV_CellFormatting dgvAVISOTV.AutoResizeColumns() AddHandler dgvAVISOTV.SelectionChanged, AddressOf dgvAVISOTV_SelectionChanged ' **Wiederherstellung der Auswahl basierend auf lastSelectedTVID** 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) Else ' Falls die TVID nicht gefunden wird, wähle die erste Zeile aus 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 If ElseIf dgvAVISOTV.Rows.Count > 0 Then dgvAVISOTV.Rows(0).Selected = True dgvAVISOTV.CurrentCell = dgvAVISOTV.Rows(0).Cells(0) dgvAVISOTV_SelectionChanged(Nothing, Nothing) End If Else AddHandler dgvAVISOTV.SelectionChanged, AddressOf dgvAVISOTV_SelectionChanged 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 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() 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 Then Return End If If cmbTvTextBezeichnungAuswahl.SelectedValue Is Nothing OrElse cmbTvTextBezeichnungAuswahl.SelectedValue Is DBNull.Value Then 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 InitializeFontComboBoxes() Dim fontFamilies As New List(Of String)() For Each font As FontFamily In FontFamily.Families fontFamilies.Add(font.Name) Next ' Initialisierung für Zeile 1 cmbFontFamily.DataSource = fontFamilies cmbFontFamily.SelectedItem = rtbZeile1.Font.FontFamily.Name Dim sizes As Integer() = {8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72} cmbFontSize.DataSource = sizes.Select(Function(s) s.ToString()).ToList() cmbFontSize.SelectedItem = CInt(rtbZeile1.Font.Size).ToString() AddHandler cmbFontFamily.SelectedIndexChanged, AddressOf cmbFontFamily_SelectedIndexChanged AddHandler cmbFontSize.SelectedIndexChanged, AddressOf cmbFontSize_SelectedIndexChanged ' Initialisierung für Zeile 2 cmbFontFamily2.DataSource = New List(Of String)(fontFamilies) cmbFontFamily2.SelectedItem = rtbZeile2.Font.FontFamily.Name cmbFontSize2.DataSource = sizes.Select(Function(s) s.ToString()).ToList() cmbFontSize2.SelectedItem = CInt(rtbZeile2.Font.Size).ToString() AddHandler cmbFontFamily2.SelectedIndexChanged, AddressOf cmbFontFamily2_SelectedIndexChanged AddHandler cmbFontSize2.SelectedIndexChanged, AddressOf cmbFontSize2_SelectedIndexChanged ' Initialisierung für Zeile 3 cmbFontFamily3.DataSource = New List(Of String)(fontFamilies) cmbFontFamily3.SelectedItem = rtbZeile3.Font.FontFamily.Name cmbFontSize3.DataSource = sizes.Select(Function(s) s.ToString()).ToList() cmbFontSize3.SelectedItem = CInt(rtbZeile3.Font.Size).ToString() AddHandler cmbFontFamily3.SelectedIndexChanged, AddressOf cmbFontFamily3_SelectedIndexChanged AddHandler cmbFontSize3.SelectedIndexChanged, AddressOf cmbFontSize3_SelectedIndexChanged End Sub ' Schriftfamilie ComboBox SelectionChanged Private Sub cmbFontFamily_SelectedIndexChanged(sender As Object, e As EventArgs) UpdateFont() End Sub ' Schriftgröße ComboBox SelectionChanged Private Sub cmbFontSize_SelectedIndexChanged(sender As Object, e As EventArgs) UpdateFont() End Sub Private Sub UpdateFont() Dim selectedFontFamily As String = If(cmbFontFamily.SelectedItem, rtbZeile1.SelectionFont?.FontFamily.Name) Dim selectedFontSize As Single If Single.TryParse(cmbFontSize.SelectedItem, selectedFontSize) Then ' Überprüfen, ob eine Auswahl vorhanden ist If rtbZeile1.SelectionLength > 0 Then ' Erstellen einer neuen Schriftart basierend auf der Auswahl Dim currentFont As Font = rtbZeile1.SelectionFont If currentFont IsNot Nothing Then rtbZeile1.SelectionFont = New Font(selectedFontFamily, selectedFontSize, currentFont.Style) Else ' Wenn die Auswahl unterschiedliche Schriftarten hat, eine neue Schriftart setzen rtbZeile1.SelectionFont = New Font(selectedFontFamily, selectedFontSize) End If Else ' Wenn keine Auswahl vorhanden ist, setzen Sie die Standard-Schriftart der RichTextBox rtbZeile1.Font = New Font(selectedFontFamily, selectedFontSize, rtbZeile1.Font.Style) End If hatAenderung = True End If End Sub ' Methode zum Umschalten des Schriftstils Private Sub ToggleFontStyle(style As FontStyle) If rtbZeile1.SelectionFont IsNot Nothing Then Dim currentFont As Font = rtbZeile1.SelectionFont Dim newFontStyle As FontStyle If rtbZeile1.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 rtbZeile1.SelectionFont = New Font(currentFont.FontFamily, currentFont.Size, newFontStyle) hatAenderung = True End If End Sub ' Fett (Bold) Button Click Private Sub btnBold_Click(sender As Object, e As EventArgs) Handles btnBold.Click ToggleFontStyle(FontStyle.Bold) End Sub ' Kursiv (Italic) Button Click Private Sub btnItalic_Click(sender As Object, e As EventArgs) Handles btnItalic.Click ToggleFontStyle(FontStyle.Italic) End Sub ' Unterstrichen (Underline) Button Click Private Sub btnUnderline_Click(sender As Object, e As EventArgs) Handles btnUnderline.Click ToggleFontStyle(FontStyle.Underline) End Sub ' Textfarbe ändern Button Click Private Sub btnTextColor_Click(sender As Object, e As EventArgs) Handles btnTextColor.Click If colorDialogText.ShowDialog() = DialogResult.OK Then rtbZeile1.SelectionColor = colorDialogText.Color hatAenderung = True End If End Sub ' Hintergrundfarbe ändern Button Click Private Sub btnBackColor_Click(sender As Object, e As EventArgs) Handles btnBackColor.Click If colorDialogText.ShowDialog() = DialogResult.OK Then rtbZeile1.SelectionBackColor = colorDialogText.Color hatAenderung = True End If End Sub ' Links ausrichten Button Click Private Sub btnAlignLeft_Click(sender As Object, e As EventArgs) Handles btnAlignLeft.Click rtbZeile1.SelectionAlignment = HorizontalAlignment.Left hatAenderung = True End Sub ' Mitte ausrichten Button Click Private Sub btnAlignCenter_Click(sender As Object, e As EventArgs) Handles btnAlignCenter.Click rtbZeile1.SelectionAlignment = HorizontalAlignment.Center hatAenderung = True End Sub ' Rechts ausrichten Button Click Private Sub btnAlignRight_Click(sender As Object, e As EventArgs) Handles btnAlignRight.Click rtbZeile1.SelectionAlignment = HorizontalAlignment.Right hatAenderung = True End Sub ' Schriftfamilie ComboBox SelectionChanged Private Sub cmbFontFamily2_SelectedIndexChanged(sender As Object, e As EventArgs) UpdateFont2() End Sub ' Schriftgröße ComboBox SelectionChanged Private Sub cmbFontSize2_SelectedIndexChanged(sender As Object, e As EventArgs) UpdateFont2() End Sub Private Sub UpdateFont2() Dim selectedFontFamily As String = If(cmbFontFamily2.SelectedItem, rtbZeile2.SelectionFont?.FontFamily.Name) Dim selectedFontSize As Single If Single.TryParse(cmbFontSize2.SelectedItem, selectedFontSize) Then ' Überprüfen, ob eine Auswahl vorhanden ist If rtbZeile2.SelectionLength > 0 Then ' Erstellen einer neuen Schriftart basierend auf der Auswahl Dim currentFont As Font = rtbZeile2.SelectionFont If currentFont IsNot Nothing Then rtbZeile2.SelectionFont = New Font(selectedFontFamily, selectedFontSize, currentFont.Style) Else ' Wenn die Auswahl unterschiedliche Schriftarten hat, eine neue Schriftart setzen rtbZeile2.SelectionFont = New Font(selectedFontFamily, selectedFontSize) End If Else ' Wenn keine Auswahl vorhanden ist, setzen Sie die Standard-Schriftart der RichTextBox rtbZeile2.Font = New Font(selectedFontFamily, selectedFontSize, rtbZeile2.Font.Style) End If hatAenderung = True End If End Sub ' Methode zum Umschalten des Schriftstils Private Sub ToggleFontStyle2(style As FontStyle) If rtbZeile2.SelectionFont IsNot Nothing Then Dim currentFont As Font = rtbZeile2.SelectionFont Dim newFontStyle As FontStyle If rtbZeile2.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 rtbZeile2.SelectionFont = New Font(currentFont.FontFamily, currentFont.Size, newFontStyle) hatAenderung = True End If End Sub ' Fett (Bold) Button Click Private Sub btnBold2_Click(sender As Object, e As EventArgs) Handles btnBold2.Click ToggleFontStyle2(FontStyle.Bold) End Sub ' Kursiv (Italic) Button Click Private Sub btnItalic2_Click(sender As Object, e As EventArgs) Handles btnItalic2.Click ToggleFontStyle2(FontStyle.Italic) End Sub ' Unterstrichen (Underline) Button Click Private Sub btnUnderline2_Click(sender As Object, e As EventArgs) Handles btnUnderline2.Click ToggleFontStyle2(FontStyle.Underline) End Sub ' Textfarbe ändern Button Click Private Sub btnTextColor2_Click(sender As Object, e As EventArgs) Handles btnTextColor2.Click If colorDialogText.ShowDialog() = DialogResult.OK Then rtbZeile2.SelectionColor = colorDialogText.Color hatAenderung = True End If End Sub ' Hintergrundfarbe ändern Button Click Private Sub btnBackColor2_Click(sender As Object, e As EventArgs) Handles btnBackColor2.Click If colorDialogText.ShowDialog() = DialogResult.OK Then rtbZeile2.SelectionBackColor = colorDialogText.Color hatAenderung = True End If End Sub ' Links ausrichten Button Click Private Sub btnAlignLeft2_Click(sender As Object, e As EventArgs) Handles btnAlignLeft2.Click rtbZeile2.SelectionAlignment = HorizontalAlignment.Left hatAenderung = True End Sub ' Mitte ausrichten Button Click Private Sub btnAlignCenter2_Click(sender As Object, e As EventArgs) Handles btnAlignCenter2.Click rtbZeile2.SelectionAlignment = HorizontalAlignment.Center hatAenderung = True End Sub ' Rechts ausrichten Button Click Private Sub btnAlignRight2_Click(sender As Object, e As EventArgs) Handles btnAlignRight2.Click rtbZeile2.SelectionAlignment = HorizontalAlignment.Right hatAenderung = True End Sub ' Schriftfamilie ComboBox SelectionChanged Private Sub cmbFontFamily3_SelectedIndexChanged(sender As Object, e As EventArgs) UpdateFont3() End Sub ' Schriftgröße ComboBox SelectionChanged Private Sub cmbFontSize3_SelectedIndexChanged(sender As Object, e As EventArgs) UpdateFont3() End Sub Private Sub UpdateFont3() Dim selectedFontFamily As String = If(cmbFontFamily3.SelectedItem, rtbZeile3.SelectionFont?.FontFamily.Name) Dim selectedFontSize As Single If Single.TryParse(cmbFontSize3.SelectedItem, selectedFontSize) Then ' Überprüfen, ob eine Auswahl vorhanden ist If rtbZeile3.SelectionLength > 0 Then ' Erstellen einer neuen Schriftart basierend auf der Auswahl Dim currentFont As Font = rtbZeile3.SelectionFont If currentFont IsNot Nothing Then rtbZeile3.SelectionFont = New Font(selectedFontFamily, selectedFontSize, currentFont.Style) Else ' Wenn die Auswahl unterschiedliche Schriftarten hat, eine neue Schriftart setzen rtbZeile3.SelectionFont = New Font(selectedFontFamily, selectedFontSize) End If Else ' Wenn keine Auswahl vorhanden ist, setzen Sie die Standard-Schriftart der RichTextBox rtbZeile3.Font = New Font(selectedFontFamily, selectedFontSize, rtbZeile3.Font.Style) End If hatAenderung = True End If End Sub ' Methode zum Umschalten des Schriftstils Private Sub ToggleFontStyle3(style As FontStyle) If rtbZeile3.SelectionFont IsNot Nothing Then Dim currentFont As Font = rtbZeile3.SelectionFont Dim newFontStyle As FontStyle If rtbZeile3.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 rtbZeile3.SelectionFont = New Font(currentFont.FontFamily, currentFont.Size, newFontStyle) hatAenderung = True End If End Sub ' Fett (Bold) Button Click Private Sub btnBold3_Click(sender As Object, e As EventArgs) Handles btnBold3.Click ToggleFontStyle3(FontStyle.Bold) End Sub ' Kursiv (Italic) Button Click Private Sub btnItalic3_Click(sender As Object, e As EventArgs) Handles btnItalic3.Click ToggleFontStyle3(FontStyle.Italic) End Sub ' Unterstrichen (Underline) Button Click Private Sub btnUnderline3_Click(sender As Object, e As EventArgs) Handles btnUnderline3.Click ToggleFontStyle3(FontStyle.Underline) End Sub ' Textfarbe ändern Button Click Private Sub btnTextColor3_Click(sender As Object, e As EventArgs) Handles btnTextColor3.Click If colorDialogText.ShowDialog() = DialogResult.OK Then rtbZeile3.SelectionColor = colorDialogText.Color hatAenderung = True End If End Sub ' Hintergrundfarbe ändern Button Click Private Sub btnBackColor3_Click(sender As Object, e As EventArgs) Handles btnBackColor3.Click If colorDialogText.ShowDialog() = DialogResult.OK Then rtbZeile3.SelectionBackColor = colorDialogText.Color hatAenderung = True End If End Sub ' Links ausrichten Button Click Private Sub btnAlignLeft3_Click(sender As Object, e As EventArgs) Handles btnAlignLeft3.Click rtbZeile3.SelectionAlignment = HorizontalAlignment.Left hatAenderung = True End Sub ' Mitte ausrichten Button Click Private Sub btnAlignCenter3_Click(sender As Object, e As EventArgs) Handles btnAlignCenter3.Click rtbZeile3.SelectionAlignment = HorizontalAlignment.Center hatAenderung = True End Sub ' Rechts ausrichten Button Click Private Sub btnAlignRight3_Click(sender As Object, e As EventArgs) Handles btnAlignRight3.Click rtbZeile3.SelectionAlignment = HorizontalAlignment.Right hatAenderung = True End Sub Private Sub LadeTvTextBezeichnungen() isInitializing = True 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 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 = items cmbTvTextBezeichnungAuswahl.DisplayMember = "DisplayText" cmbTvTextBezeichnungAuswahl.ValueMember = "ID" cmbTvTextBezeichnungAuswahl.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList cmbTvTextBezeichnungAuswahl.SelectedIndex = -1 cmbPosition.SelectedIndex = -1 isInitializing = False Debug.WriteLine("TvTextBezeichnungen geladen:") For Each item In items Debug.WriteLine($"ID: {item.ID}, Text: {item.DisplayText}") Next 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() ' Initialisiere die HTML-Struktur sb.Append("") ' Teile den Text in Absätze auf Dim paragraphs As String() = rtb.Text.Split(New String() {vbCrLf, vbLf}, StringSplitOptions.None) Dim charIndex As Integer = 0 For Each paragraph As String In paragraphs ' Wähle den aktuellen Absatz aus rtb.Select(charIndex, paragraph.Length) ' Erhalte die Ausrichtung des aktuellen Absatzes Dim alignment As HorizontalAlignment = rtb.SelectionAlignment ' Öffne einen Div-Tag mit der entsprechenden Textausrichtung Select Case alignment Case HorizontalAlignment.Left sb.Append("
") Case HorizontalAlignment.Center sb.Append("
") Case HorizontalAlignment.Right sb.Append("
") Case Else sb.Append("
") End Select ' Setze die aktuellen Formatierungsvariablen auf Nothing/Empty, um beim ersten Zeichen zu starten Dim currentFont As System.Drawing.Font = Nothing Dim currentColor As Color = Color.Empty Dim currentBackColor As Color = Color.Empty Dim currentBold As Boolean = False Dim currentItalic As Boolean = False Dim currentUnderline As Boolean = False ' Iteriere durch die Zeichen im Absatz For i As Integer = 0 To paragraph.Length - 1 Dim globalIndex As Integer = charIndex + i rtb.Select(globalIndex, 1) Dim font As System.Drawing.Font = rtb.SelectionFont Dim color As Color = rtb.SelectionColor Dim backColor As Color = rtb.SelectionBackColor ' Bestimme die Schriftstile Dim isBold As Boolean = font IsNot Nothing AndAlso font.Bold Dim isItalic As Boolean = font IsNot Nothing AndAlso font.Italic Dim isUnderline As Boolean = font IsNot Nothing AndAlso font.Underline ' Überprüfe, ob sich die Formatierung geändert hat If font IsNot currentFont OrElse color <> currentColor OrElse backColor <> currentBackColor OrElse isBold <> currentBold OrElse isItalic <> currentItalic OrElse isUnderline <> currentUnderline Then ' Schließe vorherige Font-, Farb- und Hintergrundfarb-Tags If currentFont IsNot Nothing OrElse color <> Color.Empty OrElse backColor <> Color.Empty OrElse currentBold OrElse currentItalic OrElse currentUnderline Then sb.Append("") End If ' Öffne ein neues Span-Tag mit den aktuellen Stilen Dim style As New System.Text.StringBuilder() If font IsNot Nothing Then style.Append($"font-family:{font.FontFamily.Name}; ") style.Append($"font-size:{font.SizeInPoints}pt; ") End If If color <> Color.Empty Then style.Append($"color:{ColorTranslator.ToHtml(color)}; ") End If If backColor <> Color.Empty Then style.Append($"background-color:{ColorTranslator.ToHtml(backColor)}; ") End If If isBold Then style.Append($"font-weight:bold; ") End If If isItalic Then style.Append($"font-style:italic; ") End If If isUnderline Then style.Append($"text-decoration:underline; ") End If If style.Length > 0 Then sb.Append($"") End If ' Aktualisiere die aktuellen Formatierungsvariablen currentFont = font currentColor = color currentBackColor = backColor currentBold = isBold currentItalic = isItalic currentUnderline = isUnderline End If ' Füge das aktuelle Zeichen hinzu (HTML-encodiert) Dim currentChar As Char = paragraph(i) Select Case currentChar Case "<" sb.Append("<") Case ">" sb.Append(">") Case "&" sb.Append("&") Case Else sb.Append(currentChar) End Select Next ' Schließe verbleibende Tags im Absatz If currentFont IsNot Nothing OrElse currentColor <> Color.Empty OrElse currentBackColor <> Color.Empty OrElse currentBold OrElse currentItalic OrElse currentUnderline Then sb.Append("") End If ' Schließe den Div-Tag für den Absatz sb.Append("
") ' Aktualisiere den charIndex für den nächsten Absatz (+2 für vbCrLf, könnte je nach Zeilenumbrüchen variieren) ' Überprüfe den tatsächlichen Zeilenumbruch und passe gegebenenfalls an If charIndex + paragraph.Length + 2 <= rtb.Text.Length Then charIndex += paragraph.Length + 2 ' Annahme: \r\n als Zeilenumbruch Else charIndex += paragraph.Length End If Next sb.Append("") Return sb.ToString() End Using 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() 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 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