using BrightIdeasSoftware; using DatenDB; using Deckungsbeitrag.AA_Forms; using Deckungsbeitrag.Properties; using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Drawing; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Serialization; using Timer = System.Windows.Forms.Timer; namespace Deckungsbeitrag { public partial class FormMain : Form { private Benutzer benutzer = null; Meldungen meldung = new Meldungen(); bool open = false; private bool isDragging = false; private Point dragStartPoint; private Point newLocation; private Size _fixedSize; private bool _handlingResize; private ImageList imagelist = new ImageList(); public FormMain() { InitializeComponent(); this.toolStripMenu.Size = new Size(toolStripButton1.Size.Width + 20, this.Height); //this.panelMain.Location = new Point(toolStripMenu.Right + 10, 12); if (Properties.Settings.Default.Location_ButtonNeuerAuftrag_Main != Point.Empty) this.buttonNeuerAuftrag.Location = Properties.Settings.Default.Location_ButtonNeuerAuftrag_Main; if (Properties.Settings.Default.Location_ButtonNeuerUser_Main != Point.Empty) this.buttonNeuerUser.Location = Properties.Settings.Default.Location_ButtonNeuerUser_Main; if (Properties.Settings.Default.Location_GroupBoxStatistik_Main != Point.Empty) this.groupBoxStatistik.Location = Properties.Settings.Default.Location_GroupBoxStatistik_Main; } public FormMain(Benutzer benutzer) : this() { this.benutzer = benutzer; // AKTIVE ELEMENTE JE BENUTZER ROLLE switch (benutzer.Rolle) { case BenutzerRolle.Verwaltung: this.toolStripDB.Enabled = this.toolStripButtonImport.Enabled = this.tSBExpedit.Enabled = false; this.groupBoxUpdate.Visible = this.toolStripDB.Visible = this.toolStripButtonImport.Visible = this.tSBExpedit.Enabled = false; break; case BenutzerRolle.Fahrer: // ToolStripButtons werden deaktiviert. foreach(ToolStripButton tsb in this.toolStripMenu.Items) { // Ausgewählter ToolStripButton bleibt aktiv. if(!tsb.Name.Contains("Auftrag")) tsb.Enabled = false; } // Controls im PanelMain werden deaktiviert. foreach(Control ctr in this.panelMain.Controls) { // Ausgewählte Buttons bleiben aktiv. if (ctr.Text == "Neuer Auftrag") ctr.Enabled = ctr.Visible = true; else ctr.Enabled = ctr.Visible = false; } break; case BenutzerRolle.Admin: this.groupBoxUpdate.Visible = false; break; case BenutzerRolle.Waschstrasse: this.toolStripDB.Enabled = this.toolStripButtonImport.Enabled = this.tSBBenutzerVW.Enabled = this.tSBAufgabeVW.Enabled = this.tSBExpedit.Enabled = false; this.groupBoxUpdate.Visible = this.toolStripDB.Visible = this.toolStripButtonImport.Visible = this.tSBBenutzerVW.Enabled = this.tSBAufgabeVW.Enabled = this.tSBExpedit.Enabled = false; break; case BenutzerRolle.Master: break; default: break; } } private void FormMain_Load(object sender, EventArgs e) { imagelist.Images.Add(Resources.Exclamation_Red); imagelist.Images.Add(Resources.InformationSymbol_16x); imagelist.ImageSize = new Size(16, 16); this.WindowState = FormWindowState.Maximized; this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea; this.panelMain.Width = this.Width - this.toolStripMenu.Right - 20; this.panelMain.Location = new Point(this.toolStripMenu.Right, 0); GetStatistik(); // GroupBoxen im PanelMain werden ausgeblendet foreach (Control ctr in this.panelMain.Controls) { if (ctr.GetType() == typeof(GroupBox)) { GroupBox gb = (GroupBox)ctr; if(!gb.Name.Contains("Update") & !gb.Name.Contains("Statistik") & !gb.Name.Contains("Neuer")) { gb.Visible = false; gb.Location = new Point(0, 0); gb.Size = new Size(this.panelMain.Width, this.panelMain.Height); } } } this.Activate(); _fixedSize = this.Size; } private void Paint_Boarder(Size size, Point location, PaintEventArgs e) { Pen pen = new Pen(Color.FromArgb(1, 53, 101), 4); Rectangle rect = new Rectangle(1, 2, size.Width - 4, size.Height - 4); e.Graphics.DrawRectangle(pen, rect); } private void panelMain_Paint(object sender, PaintEventArgs e) { Paint_Boarder(this.panelMain.Size, this.panelMain.Location, e); } #region ToolStripButton_Click-Events private void tSBBenutzerVW_Click(object sender, EventArgs e) { FormBenutzerVW benutzerVW = new FormBenutzerVW(); benutzerVW.ShowDialog(); } private void toolStripBeenden_Click(object sender, EventArgs e) { Application.Exit(); } private void tSBAufgabeVW_Click(object sender, EventArgs e) { FormAufgabeVW aufgabeVW = new FormAufgabeVW(); aufgabeVW.ShowDialog(); } private void toolStripZaehlscheine_Click(object sender, EventArgs e) { FormKundeVW kundedaten = new FormKundeVW(this.benutzer); if (kundedaten.ShowDialog() == DialogResult.OK) { } } private void toolStripDB_Click(object sender, EventArgs e) { FormNeuDeckungsbeitrag deckungsbeitrag = new FormNeuDeckungsbeitrag(this.benutzer, false); if (deckungsbeitrag.ShowDialog() == DialogResult.OK) { } } private void tSBWaschstrasse1_Click(object sender, EventArgs e) { //FormWaschstrasse waschstrasse = new FormWaschstrasse(this.tSBWaschverlauf.Text); //waschstrasse.ShowDialog(); //LISTVIEW MIT GEWASCHTEN FÄCHERN ERSTELLEN (KOMMT WENN BENUTZER = ADMIN) } private void toolStripButtonImport_Click(object sender, EventArgs e) { FormImport import = new FormImport(); import.ShowDialog(); } private void tSBKosten_Click(object sender, EventArgs e) { FormNeuDeckungsbeitrag deckungsbeitrag = new FormNeuDeckungsbeitrag(this.benutzer, true); if (deckungsbeitrag.ShowDialog() == DialogResult.OK) { } } private void tSBEinstellung_Click(object sender, EventArgs e) { FormEinstellung einstellung = new FormEinstellung(); einstellung.ShowDialog(); } private void toolStripStatusLabel2_DoubleClick(object sender, EventArgs e) { FormEinstellung einstellung = new FormEinstellung("Sortiment"); einstellung.ShowDialog(); } private void tSBExpedit_Click(object sender, EventArgs e) { FormExpedit exp = new FormExpedit(benutzer); exp.ShowDialog(); } private void tSBAuftragVW_Click(object sender, EventArgs e) { if (!this.objectListViewAuftrag.Visible) { if (benutzer.Rolle == BenutzerRolle.Fahrer) this.rBFertig.Checked = true; else this.rBAlle.Checked = true; this.rBAlle.Visible = this.rBAusgeliefert.Visible = this.rBFertig.Visible = this.rBVorbereitet.Visible = this.rBAufAbruf.Visible = true; this.groupBoxAuftrag.Visible = true; this.groupBoxStatistik.Visible = this.groupBoxUpdate.Visible = this.buttonNeueAufgabe.Visible = this.buttonNeueAufgabe.Enabled = this.buttonNeuerAuftrag.Visible = this.buttonNeuerAuftrag.Enabled = this.buttonNeuerUser.Visible = this.buttonNeuerUser.Enabled = false; this.objectListViewAuftrag.Enabled = this.objectListViewAuftrag.Visible = true; } else { this.groupBoxAuftrag.Visible = this.buttonAufAbruf.Visible = this.buttonAusgeliefert.Visible = this.rBAlle.Visible = this.rBAusgeliefert.Visible = this.rBFertig.Visible = this.rBVorbereitet.Visible = this.rBAufAbruf.Visible = this.objectListViewAuftrag.Enabled = this.objectListViewAuftrag.Visible = false; this.groupBoxStatistik.Visible = this.buttonNeuerAuftrag.Visible = this.buttonNeueAufgabe.Visible = this.buttonNeueAufgabe.Enabled = this.buttonNeuerAuftrag.Enabled = this.buttonNeuerUser.Enabled = this.buttonNeuerUser.Visible = true; } } private void tSBScannTest_Click(object sender, EventArgs e) { if (open) { this.groupBoxScannTest.Visible = false; this.textBoxScannTest.Visible = this.labelScannTest.Visible = this.buttonScannTest.Visible = this.pictureBoxScannTest.Visible = false; open = false; } else { this.groupBoxScannTest.Visible = true; this.textBoxScannTest.Visible = this.labelScannTest.Visible = this.buttonScannTest.Visible = this.pictureBoxScannTest.Visible = true; this.pictureBoxScannTest.Image = Image.FromFile("C:\\Users\\KilianWirl\\OneDrive - gehgassi GmbH\\Wäscherei Wirl\\Programme\\Deckungsbeitrag\\static-qr-code-ca1aa53ab47cd115bc1ad29afb0e5f22.png"); this.textBoxScannTest.Focus(); open = true; } } private void tSBArtikelVW_Click(object sender, EventArgs e) { FormArtikelVW artikelVW = new FormArtikelVW(); artikelVW.ShowDialog(); } #endregion /// /// TOOLSTRIP BUTTON DESIGN /// private void get_Border_Paint(object sender, PaintEventArgs e) { ToolStripItem item = (ToolStripItem)sender; ControlPaint.DrawBorder(e.Graphics, new Rectangle(0, 0, item.Width, item.Height), Color.White, ButtonBorderStyle.Solid); } private void toolStrip_MouseEnter(object sender, EventArgs e) { if (sender.GetType() == typeof(ToolStripButton)) { ToolStripButton tsb = (ToolStripButton)sender; tsb.ForeColor = Color.FromArgb(1, 53, 101); tsb.BackColor = Color.White; } } private void toolStrip_MouseLeave(object sender, EventArgs e) { if (sender.GetType() == typeof(ToolStripButton)) { ToolStripButton tsb = (ToolStripButton)sender; tsb.ForeColor = Color.White; tsb.BackColor = Color.FromArgb(1, 53, 101); } } /// /// Hilfe Events /// /// private void buttonNeueMaschine_HelpRequested(object sender, HelpEventArgs hlpevent) { MessageBox.Show($"Hier kannst du eine neue Maschine anlegen.{Environment.NewLine}{Environment.NewLine}Wenn du bei einer Maschine einen Trockner aus- oder einschalten willst musst du die Maschine doppelt anklicken.", "Hilfe", MessageBoxButtons.OK, MessageBoxIcon.Information); } //Hilfe bei Maschine Button und Maschine Groupbox. /// /// Panel Main Control Funktionen /// /// /// private void buttonNeuerAuftrag_Click(object sender, EventArgs e) { FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standart); neuerAuftrag.ShowDialog(); } private void buttonScannTest_Click(object sender, EventArgs e) { string s = this.textBoxScannTest.Text; int pos = s.IndexOf('#'); this.textBoxScannTest.Text = this.labelScannTest.Text = s.Substring(pos + 1); } private void buttonNeueAufgabe_Click(object sender, EventArgs e) { FormNeueAufgabe neueAufgabe = new FormNeueAufgabe(); neueAufgabe.ShowDialog(); } private void buttonNeuerStand_Click(object sender, EventArgs e) { FormNeuerAuftrag neuerAuftrag; DialogResult result = meldung.GetFrage(this, "Möchtest du eine Standverminderung oder Standerhöhung erstellen? \n\n [JA = Standverminerung | NEIN = Standerhöhung]", true); switch (result) { case DialogResult.Cancel: return; case DialogResult.Yes: neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standverminderung); neuerAuftrag.ShowDialog(); break; case DialogResult.No: neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Standerhöhung); neuerAuftrag.ShowDialog(); break; default: break; } } private void buttonNeueInventur_Click(object sender, EventArgs e) { FormNeuerAuftrag neuerAuftrag = new FormNeuerAuftrag(this.benutzer, AuftragTyp.Inventur); neuerAuftrag.ShowDialog(); } /// /// Scan QR-Code Test. /// /// /// private void textBoxScannTest_TextChanged(object sender, EventArgs e) { TextBox textBox1 = (TextBox)sender; using (Graphics g = textBox1.CreateGraphics()) { SizeF size = g.MeasureString(textBox1.Text, textBox1.Font); textBox1.Width = (int)size.Width + 10; // +10 als Puffer } } /// /// Update Events mit Button-Click /// /// /// private async void buttonArtikelUpdate_Click(object sender, EventArgs e) { FormLaden laden = new FormLaden(); laden.Show(); List sortiment = Funktionen.SortimentLesen("Liste"); sortiment = sortiment.GroupBy(a => a.ArtNr).Select(g => g.First()).ToList(); //TODO: Testen ob Get_ArtikelKurzliste funktioniert. //List artikelkurzliste = Funktionen.Get_ArtikelKurzlisteFromDatei(); // Controls blockieren progressBarArtikel.Value = 0; progressBarArtikel.Visible = true; // ProgressBar Maximum definieren progressBarArtikel.Maximum = sortiment.Count(); tSBArtikelVW.Enabled = false; // Fortschritt simulieren (z.B. Datenbankabfrage) var progress = new Progress(value => progressBarArtikel.Value = value); await Task.Run(() => { Update_Artikel(progress, sortiment); //TODO: Einkommentieren wenn ArtikelUpdate auf ArtikelKurzliste umgestellt werden kann. //Update_Artikel(progress, artikelkurzliste); }); progressBarArtikel.Value = 0; laden.Close(); this.Show(); //TODO: LadenScreen anzeigen etc. } private async void buttonSortimentUpdate_Click(object sender, EventArgs e) { //TODO: für Ladescreen den Progressbar programieren. (perplexity fragen wie der Status an einen anderen Screen übergeben werden kann) // Form Laden anzeigen FormLaden laden = new FormLaden(); laden.Show(); // Sortiment holen List sortiment = Funktionen.SortimentLesen("Liste"); // Controls blockieren progressBarArtikel.Value = 0; progressBarArtikel.Visible = true; // ProgressBar Maximum definieren progressBarArtikel.Maximum = sortiment.Count(); // Fortschritt simulieren (z.B. Datenbankabfrage) var progress = new Progress(value => progressBarArtikel.Value = value); await Task.Run(() => Update_Sortiment(progress, sortiment)); progressBarArtikel.Value = 0; //laden.Close(); //this.Show(); } private void Update_Sortiment(IProgress progress, List sortiment) { int tosave = 0; int saved = 0; int artvorhanden = 0; int anzahlkunden = 0; string sortNr = string.Empty; List kundenliste = Kunde.GetList(true, string.Empty); // ProgressBar Maximum definieren progressBarArtikel.Maximum = kundenliste.Count(); foreach (Kunde kunde in kundenliste) { // Fortschrittswert an die ProgressBar melden progress.Report(++anzahlkunden); //Jedes Innsbrucker Soziale Dienste Sortiment ist gleich. if (kunde.KundeNummer == "010069" | kunde.KundeNummer == "010071") sortNr = "010068"; else sortNr = kunde.KundeNummer; foreach (Sortiment sort in sortiment.FindAll(Sortiment => Sortiment.KundeNummer == sortNr)) { KundeArtikel item = KundeArtikel.GetItemIfAvailable(Kunde.GetKundeID(sort.KundeNummer, null), sort.ArtNr); if(item == null) { ++tosave; item = new KundeArtikel(); item.KundeID = Kunde.GetKundeID(sort.KundeNummer, null); item.ArtikelNR = sort.ArtNr; item.ArtikelName = sort.ArtName; item.Stand = 0; item.Fehlmenge = 0; item.Korrektur = 0; if (item.Save() == 1) saved++; } else ++artvorhanden; } } // Überprüfung ob alle Zeilen gespeichert wurden. if (tosave == saved) { meldung.Gespeichert(); meldung.VerarbeiteteDaten(saved, anzahlkunden, artvorhanden); } else meldung.Speicherfehler(); } private void Update_Artikel(IProgress progress, List sortiment) { int i = 0; //TODO: Artikel Update weiter testen und programmieren. Für ArtikelKurzliste ausprogrammieren. foreach (Sortiment sort in sortiment) { // Fortschrittswert an die ProgressBar melden progress.Report(++i); if (sort.ArtNr != 0) { Artikel art = Artikel.GetArtikel(sort.ArtNr); if (art.ArtikelID == null) { art = new Artikel(); art.Nummer = sort.ArtNr; art.Bezeichnung = sort.ArtName; art.Nachwaesche = 0; art.Muellwaesche = 0; art.LastReset = null; //Switch für ArtikelKategorie switch (sort.ArtNr) { case var nr when nr.ToString().StartsWith("63"): art.Kategorie = ArtikelKategorie.Frottee; break; case var nr when nr.ToString().StartsWith("611"): if (nr.ToString().StartsWith("61115") || nr.ToString().StartsWith("61116")) art.Kategorie = ArtikelKategorie.Spannleintuch; else art.Kategorie = ArtikelKategorie.Grossteile; break; case var nr when nr.ToString().StartsWith("612"): art.Kategorie = ArtikelKategorie.Kleinteile; break; default: break; } //Erstellen der Shortbezeichnung für Buttons if (art.Bezeichnung.Contains("DOPPEL") | art.Bezeichnung.Contains("D-")) art.Short = art.Short + "D-"; if (art.Bezeichnung.Contains("SPANN")) art.Short = art.Short + "SP"; if (art.Bezeichnung.Contains("LEINTUCH")) art.Short = art.Short + "LT"; if (art.Bezeichnung.Contains("SPANN")) { string[] s = art.Bezeichnung.Split(' '); if (s.Length == 3) art.Short = art.Short + " " + s[2]; } //Farben zuordnen und zu Short hinzufügen if (art.Bezeichnung.Contains("HANDTUCH")) art.Short = art.Short + "HT"; if (art.Bezeichnung.Contains("DUSCHTUCH")) art.Short = art.Short + "DT"; if (art.Bezeichnung.Contains("BADETUCH")) art.Short = art.Short + "BT"; if (art.Bezeichnung.Contains("BADEVORLEGER")) art.Short = art.Short + "BV"; if (art.Bezeichnung.Contains("BADEMANTEL")) art.Short = art.Short + "BM"; if (art.Bezeichnung.Contains("SAUNATUCH")) art.Short = art.Short + "ST"; if (art.Bezeichnung.Contains("GESICHTSTUCH")) art.Short = art.Short + "GT"; if (art.Bezeichnung.Contains("POLSTERBEZUG")) { art.Short = art.Short + "PB"; switch (art.Bezeichnung) { case var bez when bez.Contains("60x80"): art.Short = art.Short + " 60x80"; break; case var bez when bez.Contains("40x60"): art.Short = art.Short + " 40x60"; break; case var bez when bez.Contains("40x40"): art.Short = art.Short + " 40x40"; break; case var bez when bez.Contains("40x50"): art.Short = art.Short + " 40x50"; break; case var bez when bez.Contains("40x70"): art.Short = art.Short + " 40x70"; break; default: break; } } //Größen zuordnen und zu Short hinzufügen if (art.Bezeichnung.Contains("DECKENBEZUG")) art.Short = art.Short + "DB"; if (art.Bezeichnung.Contains("TISCHTUCH")) { art.Short = art.Short + "TT"; int index = art.Bezeichnung.IndexOf("x"); if (index > 0) art.Short = art.Short + art.Bezeichnung.Substring(index - 4, 8); } //Tischtücher und Größen zuordnen und zu Short hinzufügen if (art.Bezeichnung.Contains("MUNDSERVIETTE")) art.Short = art.Short + "MS"; if (art.Bezeichnung.Contains("DECKSERVIETTE")) art.Short = art.Short + "DS"; //Speichern jedes Artikels art.Save(); } else { art.Bezeichnung = sort.ArtName; art.Save(); } } } tSBArtikelVW.Enabled = true; progressBarArtikel.Value = 0; } private void buttonAllUpdate_Click(object sender, EventArgs e) { //Update_Artikel(); } /// /// AUFTRAGSVERWALTUNG FUNKTIONEN /// Button-Click AufAbruf und Ausgeliefert sowie ItemsChecked /// /// /// private void buttonAusgeliefert_Click(object sender, EventArgs e) { int saved = 0; int tosave = 0; if (this.objectListViewAuftrag.CheckedItems.Count > 0) { if (meldung.AuftragAusgeliefert() == DialogResult.Yes) { foreach (OLVListItem item in this.objectListViewAuftrag.CheckedItems) { ++tosave; Auftrag a = (Auftrag)item.RowObject; a.Erledigt = DateTime.Today; a.ErledigtVon = this.benutzer.BenutzerID; a.Status = AuftragStatus.Ausgeliefert; if (a.Save()[0] == 1) ++saved; } if (saved == tosave) GetExpeditList(null); } } } private void buttonAufAbruf_Click(object sender, EventArgs e) { if (this.objectListViewAuftrag.CheckedItems.Count == 1) { if (meldung.AuftragAufAbruf() == DialogResult.Yes) { OLVListItem item = (OLVListItem)this.objectListViewAuftrag.CheckedItems[0]; Auftrag a = (Auftrag)item.RowObject; a.Status = AuftragStatus.AufAbruf; if (a.Save()[0] == 1) GetExpeditList(null); } } else { meldung.NurEinAuftrag(); } } private void objectListViewAuftrag_ItemChecked(object sender, ItemCheckedEventArgs e) { if (this.objectListViewAuftrag.CheckedItems.Count > 0) this.buttonAusgeliefert.Visible = true; if (this.objectListViewAuftrag.CheckedItems.Count == 1) this.buttonAufAbruf.Visible = true; else this.buttonAufAbruf.Visible = false; } /// /// AUFTRAGSVERWALTUNG FUNKTIONEN /// RadioButtons für Auftragsverwaltung & Laden der Auftragsliste nach Status. /// /// /// private void RadioButton_CheckedChanged(object sender, EventArgs e) { RadioButton rB = (RadioButton)sender; if (rB.Checked) { if (Enum.TryParse(rB.Name.Substring(2), out AuftragStatus status)) rB.Tag = (int)status; else rB.Tag = null; List alist = new List(); switch (rB.Tag) { case AuftragStatus.Abgeholt: break; case AuftragStatus.Aufgelegt: break; case AuftragStatus.Finisching: break; case AuftragStatus.Herrichten: break; case AuftragStatus.Vorbereitet: GetExpeditList((int?)rB.Tag); break; case AuftragStatus.Fertig: GetExpeditList((int?)rB.Tag); break; case AuftragStatus.Ausgeliefert: GetExpeditList((int?)rB.Tag); break; case AuftragStatus.AufAbruf: GetExpeditList((int?)rB.Tag); break; default: GetExpeditList((int?)rB.Tag); break; } } } private void GetExpeditList(int? status) { Cursor.Current = Cursors.WaitCursor; this.objectListViewAuftrag.SuspendLayout(); this.objectListViewAuftrag.BeginUpdate(); List alist = new List(); alist = Auftrag.GetStatusList(status); if (alist.Count == 0) meldung.KeineAufträge(); else Load_OLV(alist); // Load_ListView(alist); this.objectListViewAuftrag.EndUpdate(); this.objectListViewAuftrag.ResumeLayout(); Cursor.Current = Cursors.Default; } /// /// AUFTRAGSVERWALTUNG FUNKTIONEN /// ObjectListView für Auftragsverwaltung laden. /// /// private void Load_OLV(List alist) { this.objectListViewAuftrag.HeaderFormatStyle = Funktionen.GetHeader(); Generator.GenerateColumns(this.objectListViewAuftrag, typeof(Auftrag), true); // ========== SPALTE 11: BUTTON-COLUMNE ========== // Spalte 11 (Index 11) als Button-Spalte konfigurieren OLVColumn buttonColumn = new OLVColumn(); buttonColumn = (OLVColumn)this.objectListViewAuftrag.Columns[11]; buttonColumn.IsButton = true; buttonColumn.ButtonSizing = OLVColumn.ButtonSizingMode.CellBounds; // ========== IMAGE-LIST ZUWEISEN ========== // SmallImageList für Icons in Detail-View (16x16 Pixel standard) this.objectListViewAuftrag.SmallImageList = imagelist; // Voraussetzung: imagelist mit Icon Index 0 gefüllt // ========== SPALTE 10 & 1: ICON-KOLUMNE ========== // Spalte 10 als Icon-Spalte: zeigt Icon wenn AufgabeID vorhanden OLVColumn iconColumn = (OLVColumn)this.objectListViewAuftrag.Columns[10]; iconColumn.ImageGetter = rowObject => { var auftrag = rowObject as Auftrag; if (auftrag.AufgabeID == null) return null; // null = kein Icon anzeigen else return 0; // Index 0 aus SmallImageList }; OLVColumn iColumn = (OLVColumn)this.objectListViewAuftrag.Columns[1]; iColumn.ImageGetter = rowObject => { var _auftrag = rowObject as Auftrag; if (string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung)) return null; // null = kein Icon anzeigen else return 1; // Index 0 aus SmallImageList }; // ========== TOOLTIP FÜR ICON-SPALTE ========== // Automatischer Cell-Tooltip bei Mouse-Hover über Spalte 10 und 1 this.objectListViewAuftrag.CellToolTipShowing += (s, e) => { // Nur für Icon-Spalte (Index 10) und gültiges Model if (e.ColumnIndex == 10 && e.Model is Auftrag auftrag) { // Lade Bezeichnung der Aufgabe als Tooltip-Text e.Text = Aufgabe.GetAufgabe(null, auftrag.AufgabeID).Bezeichnung; } // Nur für Icon-Spalte (Index 1) und gültiges Model if (e.ColumnIndex == 1 && e.Model is Auftrag _auftrag) { if (!string.IsNullOrWhiteSpace(Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung)) { // Lade Anmerkung als Tooltip-Text e.Text = Kunde.GetKunde(null, _auftrag.KundeID, null).Anmerkung; } } //TODO: Alle Icons in einer Spalte anzeigen? I für Anmerkung und ! für Aufgabe?? }; // ========== DATEN LADEN ========== // WICHTIG: SetObjects NACH Column-Konfiguration aufrufen! this.objectListViewAuftrag.SetObjects(alist); // ========== SORTIERUNG ========== // Spalte 2 als primäre Sortier-Spalte festlegen (nach Datenbindung!) OLVColumn sortcolumn = (OLVColumn)this.objectListViewAuftrag.Columns[2]; this.objectListViewAuftrag.Sort(sortcolumn); // ========== CHECKBOX-FUNKTIONALITÄT ========== // Aktiviert Checkboxen basierend auf "IsChecked" Property des Auftrag-Modells this.objectListViewAuftrag.CheckedAspectName = "IsChecked"; Funktionen.Columns_Resize(this.objectListViewAuftrag); } private void FormMain_HelpButtonClicked(object sender, CancelEventArgs e) { string[] keys = { "Aufgelegt", "Hergerichtet", "Fertig" }; string[] keytext = { "Auftrag wurde erstellt aber noch nicht ferig hergerichtet", "Auftrag wurde fertig hergerichtet aber nicht abgeschlossen. Containeranzahl kann noch bearbeitet werden.", "Auftrag wurde abgeschlossen und kann nichtmehr bearbeitet werden."}; FormHelp help = new FormHelp(keys, keytext); help.ShowDialog(); //e.Cancel = true; } private void tSBHilfe_Click(object sender, EventArgs e) { FormMain_HelpButtonClicked(this, null); } private void GetStatistik() { string[] statistik = { "Container gewaschen:", "Container hergerichtet:", "Container fertig:", "Kunden gewaschen:", "Kunden hergerichtet:", "Kunden abgeschlossen:" }; List auftraglist = Auftrag.GetAuftragStatsListToday(this.dateTimePicker1.Value.Date); for (int i = 1; i <= statistik.Length; i++) { foreach(Control ctr in this.tableLayoutPanelStatistik.Controls) { Label lbl; if (ctr.GetType() == typeof(Label)) { lbl = (Label)ctr; if (lbl.Text.Contains("Statistik") && lbl.Text.Contains($"{i.ToString()}")) lbl.Text = statistik[i - 1].ToString(); if (lbl.Name.Contains("Zahl")) { int j = 0; switch (lbl.Name) { case var s when s.Contains($"1"): foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Aufgelegt) j += a.Container; lbl.Text = j.ToString(); break; case var s when s.Contains($"2"): foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Vorbereitet) j += a.ContainerClean; lbl.Text = j.ToString(); break; case var s when s.Contains($"3"): foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Fertig) j += a.ContainerClean; lbl.Text = j.ToString(); break; case var s when s.Contains($"4"): foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Aufgelegt) j++; lbl.Text = j.ToString(); break; case var s when s.Contains($"5"): foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Vorbereitet) j++; lbl.Text = j.ToString(); break; case var s when s.Contains($"{i}"): foreach (Auftrag a in auftraglist) if (a.Status == AuftragStatus.Fertig) j++; lbl.Text = j.ToString(); break; default: break; } } } } } //this.groupBoxStatistik.Width = this.tableLayoutPanelStatistik.Right; } private void dateTimePicker1_CloseUp(object sender, EventArgs e) { GetStatistik(); } /// /// Drag & Drop für GroupBox. /// /// /// private void groupBox_Paint(object sender, PaintEventArgs e) { GroupBox gb = (GroupBox)sender; base.OnPaint(e); Funktionen.GetGroupBoxBoarder(gb, e); gb.MouseDown += groupBox_MouseDown; gb.MouseMove += groupBox_MouseMove; gb.MouseUp += groupBox_MouseUp; foreach(Control ctr in gb.Controls) { ctr.MouseDown += groupBox_MouseDown; ctr.MouseMove += groupBox_MouseMove; ctr.MouseUp += groupBox_MouseUp; } } private void groupBox_MouseDown(object sender, MouseEventArgs e) { GroupBox gb; if (sender.GetType() == typeof(GroupBox)) gb = (GroupBox)sender; else { var ctr = (Control)sender; gb = (GroupBox)ctr.Parent; } if (e.Button == MouseButtons.Left) { isDragging = true; dragStartPoint = new Point(e.X, e.Y); } } private void groupBox_MouseMove(object sender, MouseEventArgs e) { GroupBox gb; if (sender.GetType() == typeof(GroupBox)) gb = (GroupBox)sender; else { var ctr = (Control)sender; gb = (GroupBox)ctr.Parent; } Panel panel = (Panel)gb.Parent; if (isDragging) { // Neue Position berechnen, relativ zum ursprünglichen Klickpunkt newLocation = gb.PointToScreen(dragStartPoint); newLocation.X += e.X - dragStartPoint.X; newLocation.Y += e.Y - dragStartPoint.Y; // Optional: Keep inside form bounds newLocation.X = Math.Max(0, Math.Min(panel.Width - gb.Width, newLocation.X)); newLocation.Y = Math.Max(0, Math.Min(panel.Height - gb.Height, newLocation.Y)); // Position des Controls setzen newLocation = panel.PointToClient(newLocation); } } private void groupBox_MouseUp(object sender, MouseEventArgs e) { GroupBox gb; if (sender.GetType() == typeof(GroupBox)) gb = (GroupBox)sender; else { var ctr = (Control)sender; gb = (GroupBox)ctr.Parent; } if (e.Button == MouseButtons.Left) { isDragging = false; gb.Location = newLocation; } Properties.Settings.Default.Location_GroupBoxStatistik_Main = gb.Location; Properties.Settings.Default.Save(); } /// /// Drag & Drop für Buttons. /// /// /// private void Button_MouseDown(object sender, MouseEventArgs e) { Button btn = (Button)sender; if (btn != null && e.Button == MouseButtons.Left) { //btn.DoDragDrop(btn, DragDropEffects.Move); dragStartPoint = e.Location; isDragging = false; } } private void panelMain_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(Button))) e.Effect = DragDropEffects.Move; else e.Effect = DragDropEffects.None; } private void panelMain_DragDrop(object sender, DragEventArgs e) { if (isDragging) { Button btn = e.Data.GetData(typeof(Button)) as Button; if (btn != null) { Point p = this.panelMain.PointToClient(new Point(e.X, e.Y)); btn.Location = new Point(p.X - btn.Width / 2, p.Y - btn.Height / 2); } } } private void Button_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { var dx = Math.Abs(e.X - dragStartPoint.X); var dy = Math.Abs(e.Y - dragStartPoint.Y); if (!isDragging && (dx > SystemInformation.DragSize.Width || dy > SystemInformation.DragSize.Height)) { isDragging = true; var btn = sender as Button; btn.DoDragDrop(btn, DragDropEffects.Move); } } } private void Button_MouseUp(object sender, MouseEventArgs e) { var btn = sender as Button; if (!isDragging) { //btn?.PerformClick(); // oder der normale Click-Event-Handler wird aufgerufen } } /// /// Buttons auf MainPanel. Schnellzugriff für Neuer User und Neuer Auftrag. /// /// /// private void buttonNeuerUser_Click(object sender, EventArgs e) { FormNeuerBenutzer neuerBenutzer = new FormNeuerBenutzer(); neuerBenutzer.ShowDialog(); } /// /// Settings speichern bei Form_Closing. /// /// /// private void FormMain_FormClosing(object sender, FormClosingEventArgs e) { try { Properties.Settings.Default.Location_ButtonNeuerAuftrag_Main = this.buttonNeuerAuftrag.Location; Properties.Settings.Default.Location_ButtonNeuerUser_Main = this.buttonNeuerUser.Location; Properties.Settings.Default.Location_GroupBoxStatistik_Main = this.groupBoxStatistik.Location; Properties.Settings.Default.Save(); } catch (Exception ex) { MessageBox.Show("Fehler beim Speichern" + ex.Message); } } private void FormMain_ResizeBegin(object sender, EventArgs e) { _handlingResize = true; this.Size = _fixedSize; _handlingResize = false; } private void FormMain_Resize(object sender, EventArgs e) { if (_handlingResize) return; if(this.Size != _fixedSize) { _handlingResize = true; this.Size = _fixedSize; _handlingResize = false; } } } } //CHANGES: Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren. //CHANGES: Auftragverwaltung Spalten wurden aktualisiert. Mit Icons, Buttons und Sortierung auf Liefertag. //DONE: 2 neue Buttons für "Neue Inventur" und "Neue Standveränderung" //DONE: Bei Fahrer neue Deaktivierung von Controls.