From a78cd3dc328bde56cb4ba3774cc59bdbf688bc70 Mon Sep 17 00:00:00 2001 From: Kilian Wirl Date: Tue, 5 May 2026 13:44:15 +0200 Subject: [PATCH] =?UTF-8?q?Reklamation=20erstellt=20jetzt=20ein=20Etikett.?= =?UTF-8?q?=20Die=20Berechnung=20des=20Bestandes=20wurde=20=C3=BCberarbeit?= =?UTF-8?q?et.=20Etwas=20Code-Kosmetik=20wurde=20gemacht.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AA-Forms/CustomInputBox.cs | 2 +- AA-Forms/FormAuftragDetail.Designer.cs | 18 +- AA-Forms/FormAuftragDetail.cs | 227 ++++--- AA-Forms/FormEinstellung.cs | 16 - AA-Forms/FormExpedit.cs | 3 +- AA-Forms/FormFehlmengeCount.cs | 52 +- AA-Forms/FormListe.cs | 5 +- AA-Forms/FormLogin.cs | 12 +- AA-Forms/FormLogin.designer.cs | 1 + AA-Forms/FormNeuerAuftrag.cs | 24 +- AA-Klassen/Auftrag.cs | 2 - AA-Klassen/Funktionen.cs | 83 ++- AA-Klassen/KundeArtikel.cs | 2 +- Program.cs | 88 +-- Properties/AssemblyInfo.cs | 4 +- SetupVerwaltung/SetupVerwaltung.vdproj | 670 ++++++++------------- UserControls/UCFeedback.cs | 1 - UserControls/UCInventur.cs | 6 +- UserControls/UCKunde.cs | 3 +- Verwaltung_ReadMe.txt | 19 +- VirtualKeyboard/Properties/AssemblyInfo.cs | 4 +- VirtualKeyboard/QwertzKeyboard.cs | 10 +- 22 files changed, 614 insertions(+), 638 deletions(-) diff --git a/AA-Forms/CustomInputBox.cs b/AA-Forms/CustomInputBox.cs index 0b3c03a..5f64eee 100644 --- a/AA-Forms/CustomInputBox.cs +++ b/AA-Forms/CustomInputBox.cs @@ -36,7 +36,7 @@ namespace Deckungsbeitrag.AA_Forms private void TextBoxText_Click(object sender, EventArgs e) { this.textBoxText.Clear(); - if (TouchHelper.IsTouchDeviceReady()) + if (Program.istTouch && !Program.hatTastatur) { if (keyboard == null || keyboard.IsDisposed) { diff --git a/AA-Forms/FormAuftragDetail.Designer.cs b/AA-Forms/FormAuftragDetail.Designer.cs index ec884d1..671d690 100644 --- a/AA-Forms/FormAuftragDetail.Designer.cs +++ b/AA-Forms/FormAuftragDetail.Designer.cs @@ -99,7 +99,7 @@ this.buttonFertig.TabIndex = 14; this.buttonFertig.Text = "Speichern/Abschließen"; this.buttonFertig.UseVisualStyleBackColor = false; - this.buttonFertig.Click += new System.EventHandler(this.buttonFertig_Click); + this.buttonFertig.Click += new System.EventHandler(this.ButtonFertig_Click); // // buttonAbbrechen // @@ -116,7 +116,7 @@ this.buttonAbbrechen.TabIndex = 0; this.buttonAbbrechen.Text = "Abbrechen"; this.buttonAbbrechen.UseVisualStyleBackColor = false; - this.buttonAbbrechen.Click += new System.EventHandler(this.buttonAbbrechen_Click); + this.buttonAbbrechen.Click += new System.EventHandler(this.ButtonAbbrechen_Click); // // labelRegion // @@ -201,7 +201,7 @@ this.labelContainer.TabIndex = 28; this.labelContainer.Text = "0"; this.labelContainer.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; - this.labelContainer.TextChanged += new System.EventHandler(this.labelContainer_TextChanged); + this.labelContainer.TextChanged += new System.EventHandler(this.LabelContainer_TextChanged); // // label5 // @@ -256,7 +256,7 @@ this.comboBoxPriority.Name = "comboBoxPriority"; this.comboBoxPriority.Size = new System.Drawing.Size(348, 37); this.comboBoxPriority.TabIndex = 41; - this.comboBoxPriority.SelectedValueChanged += new System.EventHandler(this.comboBox_SelectedValueChanged); + this.comboBoxPriority.SelectedValueChanged += new System.EventHandler(this.ComboBox_SelectedValueChanged); // // comboBoxFahrer // @@ -267,7 +267,7 @@ this.comboBoxFahrer.Name = "comboBoxFahrer"; this.comboBoxFahrer.Size = new System.Drawing.Size(348, 37); this.comboBoxFahrer.TabIndex = 42; - this.comboBoxFahrer.SelectedValueChanged += new System.EventHandler(this.comboBox_SelectedValueChanged); + this.comboBoxFahrer.SelectedValueChanged += new System.EventHandler(this.ComboBox_SelectedValueChanged); // // pictureBoxDirtMinus // @@ -362,11 +362,9 @@ this.oLVArtikel.UseCompatibleStateImageBehavior = false; this.oLVArtikel.UseSubItemCheckBoxes = true; this.oLVArtikel.View = System.Windows.Forms.View.Details; - this.oLVArtikel.CellEditFinished += new BrightIdeasSoftware.CellEditEventHandler(this.oLVArtikel_CellEditFinished); - this.oLVArtikel.CellEditStarting += new BrightIdeasSoftware.CellEditEventHandler(this.oLVArtikel_CellEditStarting); - this.oLVArtikel.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.OLVArtikel_ItemCheck); - this.oLVArtikel.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.oLVArtikel_ItemChecked); - this.oLVArtikel.SizeChanged += new System.EventHandler(this.oLVArtikel_SizeChanged); + this.oLVArtikel.CellEditFinished += new BrightIdeasSoftware.CellEditEventHandler(this.OLVArtikel_CellEditFinished); + this.oLVArtikel.ItemChecked += new System.Windows.Forms.ItemCheckedEventHandler(this.OLVArtikel_ItemChecked); + this.oLVArtikel.SizeChanged += new System.EventHandler(this.OLVArtikel_SizeChanged); // // FormAuftragDetail // diff --git a/AA-Forms/FormAuftragDetail.cs b/AA-Forms/FormAuftragDetail.cs index f1522c7..4e5ccd4 100644 --- a/AA-Forms/FormAuftragDetail.cs +++ b/AA-Forms/FormAuftragDetail.cs @@ -72,7 +72,7 @@ namespace Deckungsbeitrag { InitializeComponent(); //this.BackColor = Properties.Settings.Default.Wirlblau; - labelContainer_TextChanged(this.labelContainer, EventArgs.Empty); + LabelContainer_TextChanged(this.labelContainer, EventArgs.Empty); } public FormAuftragDetail(Auftrag auftrag, Benutzer benutzer) : this() @@ -99,8 +99,8 @@ namespace Deckungsbeitrag this.comboBoxPriority.SelectedItem = auftrag.Priority; // Events nach dem Laden der Daten wieder den ComboBoxen zuweisen. - this.comboBoxPriority.SelectedValueChanged += comboBox_SelectedValueChanged; - this.comboBoxFahrer.SelectedValueChanged += comboBox_SelectedValueChanged; + this.comboBoxPriority.SelectedValueChanged += ComboBox_SelectedValueChanged; + this.comboBoxFahrer.SelectedValueChanged += ComboBox_SelectedValueChanged; if (this.auftrag.Typ != AuftragTyp.Inventur || (this.auftrag.Typ == AuftragTyp.Inventur & this.auftrag.Status == AuftragStatus.Herrichten)) Load_OLV(); else @@ -161,13 +161,13 @@ namespace Deckungsbeitrag this.oLVArtikel = Funktionen.Columns_Resize(null, this.oLVArtikel).olv; // Wenn alle Artikel Checked sind TOCLOSE auslösen. - oLVArtikel_ItemChecked(this.oLVArtikel, null); + OLVArtikel_ItemChecked(this.oLVArtikel, null); } private void LadeComboBoxen() { - this.comboBoxFahrer.SelectedValueChanged -= comboBox_SelectedValueChanged; - this.comboBoxPriority.SelectedValueChanged -= comboBox_SelectedValueChanged; + this.comboBoxFahrer.SelectedValueChanged -= ComboBox_SelectedValueChanged; + this.comboBoxPriority.SelectedValueChanged -= ComboBox_SelectedValueChanged; List benutzerliste = Benutzer.GetFahrerList(); this.comboBoxFahrer.DataSource = benutzerliste; @@ -175,11 +175,11 @@ namespace Deckungsbeitrag this.comboBoxPriority.DataSource = Enum.GetValues(typeof(Priority)); } - private void comboBox_SelectedValueChanged(object sender, EventArgs e) + private void ComboBox_SelectedValueChanged(object sender, EventArgs e) { Tosave = true; } - private void labelContainer_TextChanged(object sender, EventArgs e) + private void LabelContainer_TextChanged(object sender, EventArgs e) { if (this.labelContainer.Text == "0") { this.pictureBoxMinus.Enabled = this.pictureBoxDirtMinus.Enabled = false; this.pictureBoxMinus.BackColor = this.pictureBoxDirtMinus.BackColor = Color.Gray; } else { this.pictureBoxMinus.Enabled = this.pictureBoxDirtMinus.Enabled = true; this.pictureBoxMinus.BackColor = this.pictureBoxDirtMinus.BackColor = Color.Red; } @@ -196,7 +196,7 @@ namespace Deckungsbeitrag auftrag.ZusatzInfo = this.textBoxZusatz.Text; auftrag.Save(); - if (auftrag.Typ == AuftragTyp.Regelmäßig || (auftrag.Typ == AuftragTyp.Inventur & auftrag.Status == AuftragStatus.Herrichten)) + if (auftrag.Typ <= AuftragTyp.Regelmäßig && (auftrag.Typ >= AuftragTyp.Inventur) && auftrag.Status == AuftragStatus.Herrichten) { foreach (var kvp in auftragDictionary) { @@ -207,14 +207,6 @@ namespace Deckungsbeitrag aufart.Save(); } - //foreach (OLVListItem item in this.oLVArtikel.Items) - //{ - // AuftragArtikel art = (AuftragArtikel)item.RowObject; - // if (item.Checked) art.Erledigt = true; - // else art.Erledigt = false; - - // art.Save(); - //} if (auftrag.Typ == AuftragTyp.Inventur) { foreach (var kvp in dictionary) @@ -254,7 +246,7 @@ namespace Deckungsbeitrag { if (MessageBox.Show("Möchtest du JETZT Etiketten für die erfolgten Änderung drucken?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { - if (Funktionen.SonderEtikett_Drucken(this.auftrag, dictionary) == DialogResult.OK) + if (Funktionen.SonderEtikett_Drucken(this.auftrag.KundeID, dictionary) == DialogResult.OK) { etikettgedruckt = true; } @@ -310,7 +302,7 @@ namespace Deckungsbeitrag #region Button-Click //AUFTRAG ABBRECHEN - private void buttonAbbrechen_Click(object sender, EventArgs e) + private void ButtonAbbrechen_Click(object sender, EventArgs e) { //if (_tosave) //{ @@ -332,7 +324,7 @@ namespace Deckungsbeitrag } //AUFTRAG ABSCHLIESSEN - private void buttonFertig_Click(object sender, EventArgs e) + private void ButtonFertig_Click(object sender, EventArgs e) { EtikettDrucken(); if (Tosave && etikettgedruckt) AuftragSpeichern(); @@ -379,7 +371,7 @@ namespace Deckungsbeitrag auftrag.Gedruckt = DateTime.Now; auftrag.GedrucktVon = benutzer.BenutzerID; auftrag.Status = AuftragStatus.Fertig; - + bool nocont = false; if (MessageBox.Show("Möchtest du die Containeranzahl am Etikett anzeigen?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { @@ -427,6 +419,7 @@ namespace Deckungsbeitrag this.DialogResult = DialogResult.OK; this.Close(); } + else this.Close(); } @@ -435,16 +428,22 @@ namespace Deckungsbeitrag /// /// TOCLOSE /// - private void oLVArtikel_ItemChecked(object sender, ItemCheckedEventArgs e) + private void OLVArtikel_ItemChecked(object sender, ItemCheckedEventArgs e) { ObjectListView olv = (ObjectListView)sender; - if (olv.Items.Count == olv.CheckedItems.Count) Toclose = true; - foreach(OLVListItem item in olv.CheckedItems) + if (e == null) return; + OLVListItem item = e.Item as OLVListItem; + AuftragArtikel auftragArtikel = (AuftragArtikel)item.RowObject; + if (item.Checked) { - AuftragArtikel auftragArtikel = (AuftragArtikel)item.RowObject; auftragArtikel.Erledigt = true; - auftragArtikel.Save(); + int oldValue = auftragArtikel.Anzahl; + int newValue = 0; + ChangeAnzahl(newValue, oldValue, auftragArtikel); } + else auftragArtikel.Erledigt = false; + + if (olv.Items.Count == olv.CheckedItems.Count) Toclose = true; } @@ -556,34 +555,21 @@ namespace Deckungsbeitrag //if (oLVArtikel != null) this.ClientSize = new Size(oLVArtikel.Right + 10, oLVArtikel.Bottom + buttonAbbrechen.Height + 25); } - - private void oLVArtikel_CellEditStarting(object sender, CellEditEventArgs e) + private void ChangeAnzahl(int newValue, int oldvalue, AuftragArtikel auftragArtikel) { - - } - - private void oLVArtikel_CellEditFinished(object sender, CellEditEventArgs e) - { - this.Cursor = Cursors.WaitCursor; - this.SuspendLayout(); - - ObjectListView olv = (ObjectListView)sender; - AuftragArtikel auftragArtikel = (AuftragArtikel)e.RowObject; - int newValue = (int)e.NewValue; - - if (this.auftrag.Typ == AuftragTyp.SOLL_Verminderung) if (newValue > 0) newValue = newValue * -1; - if (e.Column.Text == "Anzahl") diff = (int)e.Value - (newValue); + if (this.auftrag.Typ == AuftragTyp.SOLL_Verminderung) if (newValue > 0) newValue *= -1; + diff = oldvalue - (newValue); if (diff != 0) Tosave = true; if (auftragDictionary.TryGetValue((int)auftragArtikel.AuftragArtikelID, out int val)) { - val = newValue; - if (newValue == 0) e.ListViewItem.Checked = true; + auftragDictionary[(int)auftragArtikel.AuftragArtikelID] = newValue; + //if (newValue == 0) e.ListViewItem.Checked = true; } else auftragDictionary.Add((int)auftragArtikel.AuftragArtikelID, newValue); KundeArtikel kndart = KundeArtikel.GetKundeArtikelVonArtikelID(this.kunde.KundeID, auftragArtikel.ArtikelID); - + int reklamation = kndart.Reklamation; int fehlmenge = kndart.Fehlmenge; int stand = kndart.Stand; @@ -602,59 +588,124 @@ namespace Deckungsbeitrag this.ResumeLayout(); this.Cursor = Cursors.Default; + } + private void OLVArtikel_CellEditFinished(object sender, CellEditEventArgs e) + { + this.Cursor = Cursors.WaitCursor; + this.SuspendLayout(); + + ObjectListView olv = (ObjectListView)sender; + AuftragArtikel auftragArtikel = (AuftragArtikel)e.RowObject; + int newValue = (int)e.NewValue; + int oldValue = (int)e.Value; + + ChangeAnzahl(newValue, oldValue, auftragArtikel); + + //if (this.auftrag.Typ == AuftragTyp.SOLL_Verminderung) if (newValue > 0) newValue = newValue * -1; + //if (e.Column.Text == "Anzahl") diff = (int)e.Value - (newValue); + //if (diff != 0) Tosave = true; + + //if (auftragDictionary.TryGetValue((int)auftragArtikel.AuftragArtikelID, out int val)) + //{ + // val = newValue; + // if (newValue == 0) e.ListViewItem.Checked = true; + //} + //else auftragDictionary.Add((int)auftragArtikel.AuftragArtikelID, newValue); + + //KundeArtikel kndart = KundeArtikel.GetKundeArtikelVonArtikelID(this.kunde.KundeID, auftragArtikel.ArtikelID); + + //int reklamation = kndart.Reklamation; + //int fehlmenge = kndart.Fehlmenge; + //int stand = kndart.Stand; + //int korrektur = kndart.Korrektur; + //KorrigiereBestand(diff, ref reklamation, ref fehlmenge, ref stand, ref korrektur); + + //if (dictionary.TryGetValue((int)kndart.KundeArtikelID, out int[] value)) + //{ + // for (int i = 0; i < value.Length; i++) + // { + // value[i] += bestand[i]; + // } + //} + //else dictionary.Add((int)kndart.KundeArtikelID, bestand); + ////WriteToCSV(kndart); + //this.ResumeLayout(); + //this.Cursor = Cursors.Default; + } public void KorrigiereBestand(int diff, ref int reklamation, ref int fehlmenge, ref int stand, ref int korrektur) { bestand = new int[4]; if (diff == 0) return; - if (diff < 0 || this.auftrag.Typ == AuftragTyp.SOLL_Erhoehung) { bestand[2] = diff; stand += diff; return; } - int rest = diff * 1; - - // 1) Reklamation nur korrigieren, wenn sie <= diff ist - if (reklamation > 0 && reklamation <= rest) + switch (this.auftrag.Typ) { - rest -= reklamation; - bestand[0] = reklamation; - reklamation = 0; + case AuftragTyp.Inventur: + { + if (diff < 0) // Diff ist negativ + { + int korr = diff; + bestand[3] = korr; + korrektur -= korr; + } + else // Diff ist positiv + { + int korr = diff; + bestand[3] = korr; + korrektur -= korr; + } + } + break; + case AuftragTyp.SOLL_Erhoehung: + { + if (diff < 0) { MessageBox.Show("Eine SOLL-Erhöhung kann keine negative Zahl haben. Bitte korrigiere die Zahlen.", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } + bestand[2] = diff; + stand += diff; + } + break; + case AuftragTyp.IST_Erhoehung: + { + if (diff < 0) { MessageBox.Show("Eine IST-Erhöhung kann keine negative Zahl haben. Bitte korrigiere die Zahlen.", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } + goto default; + } + case AuftragTyp.SOLL_Verminderung: + { + if (diff > 0) { MessageBox.Show("Eine SOLL-Verminderung kann keine positiven Zahlen haben. Bitte korrigiere die Zahlen.", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Stop ); return; } + bestand[2] = diff; + stand += diff; + } + break; + default: + { + int rest = diff; + // 1) Reklamation nur korrigieren, wenn sie <= diff ist + if (reklamation > 0) + { + int reduktion = Math.Min(reklamation, rest); + bestand[0] = reduktion; + reklamation -= reduktion; + rest -= reduktion; + } + // 2) Fehlmenge korrigieren + if (fehlmenge > 0) + { + int abbau = Math.Min(fehlmenge, rest); + bestand[1] = abbau; + fehlmenge -= abbau; + rest -= abbau; + } + // 3) Rest auf Stand buchen + if (rest > 0) + stand += rest; + bestand[2] = rest; + } + break; } - // 2) Fehlmenge korrigieren - if (fehlmenge > 0) - { - int abbau = Math.Min(fehlmenge, rest); - bestand[1] = abbau; - fehlmenge -= abbau; - rest -= abbau; - } - - // 3) Inventurausgleich korrigieren - if (korrektur > 0) - { - int korr = Math.Min(korrektur, rest); - bestand[3] = korr; - korrektur -= korr; - rest -= korr; - } - // 4) Rest auf Stand buchen - if (rest > 0) - stand += rest; - bestand[2] = rest; - } - private void oLVArtikel_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) - { - Tosave = true; } - private void FormAuftragDetail_Resize(object sender, EventArgs e) - { - if (fb != null) fb.Location = new Point(this.ClientSize.Width - fb.Width - 7, 0); - if (uci != null) this.ClientSize = new Size(uci.Right, uci.Bottom + buttonAbbrechen.Height + 25); - if (oLVArtikel != null) this.ClientSize = new Size(oLVArtikel.Right + 10, oLVArtikel.Bottom + buttonAbbrechen.Height + 25); - } - - private void oLVArtikel_SizeChanged(object sender, EventArgs e) + private void OLVArtikel_SizeChanged(object sender, EventArgs e) { this.ClientSize = new Size(oLVArtikel.Right + 10, oLVArtikel.Bottom + buttonAbbrechen.Height + 25); } @@ -677,4 +728,6 @@ namespace Deckungsbeitrag //CHANGES: 3. Abschließen nur möglich wenn alle Artikel auf 0 sind (Checked) und gespeichert wurde. //CHANGES: Bei Druckabbruch wird die geänderte Zahl NICHT zurückgesetzt. (Das muss händisch erfolgen) //CHANGES: Wenn die Zahlen zurückgesetzt werden sollen, muss AuftragDetail geschlossen werden. -//CHANGES: Wenn die reduzierte Anzahl bei SOLL-Verminderung nicht negativ ist, wird diese negativ gemacht. So wird ein möglicher Fehler ausgebessert. \ No newline at end of file +//CHANGES: Wenn die reduzierte Anzahl bei SOLL-Verminderung nicht negativ ist, wird diese negativ gemacht. So wird ein möglicher Fehler ausgebessert. +//CHANGES: Beim Speichern ohne Abschließen schließt sich das Fenster nach dem Speichern. +//CHANGES: Wenn ein Artikel vollständig hergerichtet wird, muss er nur abgehackt werden. Den Rest macht der Computer. \ No newline at end of file diff --git a/AA-Forms/FormEinstellung.cs b/AA-Forms/FormEinstellung.cs index 1b66028..cbfc0a7 100644 --- a/AA-Forms/FormEinstellung.cs +++ b/AA-Forms/FormEinstellung.cs @@ -98,22 +98,6 @@ namespace Deckungsbeitrag if (MessageBox.Show("Möchtest du die Einstellungen speichern?", "Frage", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return; else { - //TODO: Hier Settings speichern mit UserSettingsManager Klasse. - //if (changed) - //{ - // Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); - // config.AppSettings.Settings.Remove("SortimentPfad"); - // config.AppSettings.Settings.Add("SortimentPfad", this.textBoxSortiment.Text); - // config.AppSettings.Settings.Remove("BildPfad"); - // config.AppSettings.Settings.Add("BildPfad", this.textBoxRatingbild.Text); - - // config.Save(); - //} - //if (this.checkBoxMaxWert.Checked) Settings.Default.MaxChecked = this.checkBoxMaxWert.Checked; - //if (this.checkBoxMinWert.Checked) Settings.Default.MinChecked = this.checkBoxMinWert.Checked; - //if (this.numUpDownMinWert.Enabled) Settings.Default.RatMin = (double)this.numUpDownMinWert.Value; - //if (this.numUpDownMaxWert.Enabled) Settings.Default.RatMax = (double)this.numUpDownMaxWert.Value; - if (this.comboBoxEtikettDrucker.SelectedItem != null) _settings.DruckerEtikett = this.comboBoxEtikettDrucker.SelectedItem.ToString(); if (this.comboBoxSWSDrucker.SelectedItem != null) { _settings.DruckerSWS = this.comboBoxSWSDrucker.SelectedItem.ToString(); _settings.CopiesSWS = this.numericUpDownSWSKopien.Value; } if (this.comboBoxTourenlisteDrucker.SelectedItem != null) _settings.DruckerTourenListe = this.comboBoxTourenlisteDrucker.ToString(); diff --git a/AA-Forms/FormExpedit.cs b/AA-Forms/FormExpedit.cs index 7ded418..4e4b712 100644 --- a/AA-Forms/FormExpedit.cs +++ b/AA-Forms/FormExpedit.cs @@ -595,7 +595,7 @@ namespace Deckungsbeitrag } break; default: - if (_auftrag.Typ == AuftragTyp.Regelmäßig || _auftrag.Typ == AuftragTyp.SOLL_Erhoehung || _auftrag.Typ == AuftragTyp.SOLL_Verminderung || _auftrag.Typ == AuftragTyp.Inventur) + if (_auftrag.Typ == AuftragTyp.Regelmäßig || _auftrag.Typ == AuftragTyp.SOLL_Erhoehung || _auftrag.Typ == AuftragTyp.SOLL_Verminderung || _auftrag.Typ == AuftragTyp.Inventur || _auftrag.Typ == AuftragTyp.IST_Erhoehung) { FormAuftragDetail auftragDetail = new FormAuftragDetail(_auftrag, this.benutzer); if (auftragDetail.ShowDialog() == DialogResult.OK) @@ -1145,7 +1145,6 @@ namespace Deckungsbeitrag /// private void Auftrag_Fertig() { - //TODO: Auftrag richtig speichern... mit gedruckt bzw. erledigt bzw. if (this.benutzer.Rolle == BenutzerRolle.Frottee) this.auftrag.Abteilungen |= AbteilungsStatus.FrotteeBeendet; else this.auftrag.Status = AuftragStatus.Fertig; this.auftrag.Save(); diff --git a/AA-Forms/FormFehlmengeCount.cs b/AA-Forms/FormFehlmengeCount.cs index 4be0aeb..240614e 100644 --- a/AA-Forms/FormFehlmengeCount.cs +++ b/AA-Forms/FormFehlmengeCount.cs @@ -3,6 +3,7 @@ using DatenDB; using Deckungsbeitrag.AA_Klassen; using System; using System.CodeDom; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; @@ -30,7 +31,8 @@ namespace Deckungsbeitrag private List auftragsliste; private ArtikelKategorie kategorie; readonly string userid; - + private Dictionary auftragDictionary = new Dictionary(); + private bool etikettgedruckt = false; #region Form-Konstruktor public FormFehlmengeCount() @@ -158,7 +160,6 @@ namespace Deckungsbeitrag foreach (Button btn in this.tableLayoutPanelArtikel.Controls) btn.Tag = btn.Text = null; this.groupBoxArtikel.Visible = true; this.tableLayoutPanelArtikel.Visible = true; - //TODO: Nach Test und Rücksprache eventuell wieder umbauen. Benutzer.Rolle etc. // Buttons werden den Artikeln aus der Artikelliste zugewiesen. Unterschied zwischen Frotteewäsche, Spannleintüchern, Großteilen und Kleinteilen foreach (KundeArtikel artikel in artikelListe) { @@ -418,17 +419,22 @@ namespace Deckungsbeitrag if ((userid != null && userid.Contains("reklamation")) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Expedit) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Frottee)) { - DialogResult result = meldung.GetFrage(this, "Möchtest du eine weitere Reklamation eingeben?", false); - switch (result) + EtikettDrucken(); + if (etikettgedruckt) { - case DialogResult.Yes: - break; - case DialogResult.No: - this.Close(); - return; - default: - break; + DialogResult result = meldung.GetFrage(this, "Möchtest du eine weitere Reklamation eingeben?", false); + switch (result) + { + case DialogResult.Yes: + break; + case DialogResult.No: + this.Close(); + return; + default: + break; + } } + else return; } else { @@ -443,7 +449,17 @@ namespace Deckungsbeitrag Open_Liste(); ControlLaden(); } - + private void EtikettDrucken() + { + if (MessageBox.Show("Möchtest du JETZT Etiketten für die erfolgten Änderung drucken?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + if (Funktionen.SonderEtikett_Drucken((int)this.kunde.KundeID, auftragDictionary) == DialogResult.OK) + { + etikettgedruckt = true; + } + } + } + /// /// Auftragliste aufrufen. /// @@ -537,7 +553,17 @@ namespace Deckungsbeitrag }; } - if ((userid != null && userid.Contains("reklamation")) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Expedit) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Frottee)) { kndart.Reklamation++; artnw.Reklamation++; } + if ((userid != null && userid.Contains("reklamation")) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Expedit) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Frottee)) + { + artnw.Reklamation++; + kndart.Reklamation++; + if (auftragDictionary.TryGetValue((int)kndart.KundeArtikelID, out int val)) + { + auftragDictionary[(int)kndart.KundeArtikelID] = kndart.Reklamation; + } + else auftragDictionary.Add((int)kndart.KundeArtikelID, kndart.Reklamation); + + } else { kndart.Fehlmenge++; artnw.Nachwaesche++; } // Wenn speichern nicht möglich, wird darauf hingewiesen. diff --git a/AA-Forms/FormListe.cs b/AA-Forms/FormListe.cs index fe63528..b180c27 100644 --- a/AA-Forms/FormListe.cs +++ b/AA-Forms/FormListe.cs @@ -91,7 +91,6 @@ namespace Deckungsbeitrag { this.CenterToScreen(); } - private void ListViewKunde_Load() { //LISTE LEEREN @@ -503,15 +502,13 @@ namespace Deckungsbeitrag this.Close(); } } - private void FormListe_FormClosing(object sender, FormClosingEventArgs e) { if (keyboard != null) keyboard.Close(); } - private void TextBoxKunde_Click(object sender, EventArgs e) { - if (TouchHelper.IsTouchDeviceReady()) + if (Program.istTouch && !Program.hatTastatur) { if (keyboard == null || keyboard.IsDisposed) { diff --git a/AA-Forms/FormLogin.cs b/AA-Forms/FormLogin.cs index d98dd11..34ddb62 100644 --- a/AA-Forms/FormLogin.cs +++ b/AA-Forms/FormLogin.cs @@ -23,7 +23,8 @@ namespace Deckungsbeitrag string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; private QwertzKeyboard keyboard; private OnboardingSchritt onBoardingArt; - public Benutzer Person { get; set; } + + public Benutzer Person { get; set; } public FormLogin() { @@ -152,9 +153,10 @@ namespace Deckungsbeitrag private void TextBoxBenutzer_Enter(object sender, EventArgs e) { - this.textBoxBenutzer.SelectAll(); - if (TouchHelper.IsTouchDeviceReady()) + this.textBoxBenutzer.SelectAll(); + + if (Program.istTouch && !Program.hatTastatur) { if (keyboard == null || keyboard.IsDisposed) { @@ -173,7 +175,7 @@ namespace Deckungsbeitrag private void TextBoxPasswort_Enter(object sender, EventArgs e) { - if (TouchHelper.IsTouchDeviceReady()) + if (Program.istTouch && !Program.hatTastatur) { if (keyboard == null || keyboard.IsDisposed) { @@ -196,7 +198,7 @@ namespace Deckungsbeitrag private void TextBoxPwdWh_Enter(object sender, EventArgs e) { - if (TouchHelper.IsTouchDeviceReady()) + if (Program.istTouch && !Program.hatTastatur) { if (keyboard == null || keyboard.IsDisposed) { diff --git a/AA-Forms/FormLogin.designer.cs b/AA-Forms/FormLogin.designer.cs index a0a128b..46beef0 100644 --- a/AA-Forms/FormLogin.designer.cs +++ b/AA-Forms/FormLogin.designer.cs @@ -210,6 +210,7 @@ namespace Deckungsbeitrag this.Name = "FormLogin"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "LOGIN Version: "; + this.TopMost = true; this.Load += new System.EventHandler(this.FormLogin_Load); this.Shown += new System.EventHandler(this.FormLogin_Shown); this.groupBox1.ResumeLayout(false); diff --git a/AA-Forms/FormNeuerAuftrag.cs b/AA-Forms/FormNeuerAuftrag.cs index 11a9d6e..60ed263 100644 --- a/AA-Forms/FormNeuerAuftrag.cs +++ b/AA-Forms/FormNeuerAuftrag.cs @@ -320,10 +320,25 @@ namespace Deckungsbeitrag this.Height = 470; this.textBoxText.BringToFront(); break; + case AuftragTyp.IST_Erhoehung: + if (this.kunde == null) return; + this.textBoxText.Visible = false; + this.panelRegAuftrag.Enabled = this.panelRegAuftrag.Visible = true; + this.pictureBoxPlus.Enabled = this.pictureBoxMinus.Enabled = this.textBoxCont.Enabled = false; + this.labelText.Text = "Rhythmus:"; + this.Width = this.panelRegAuftrag.Right + 25; + this.Height = 470; + break; default: break; } - PanelRegAuftrag_EnabledChanged(this.panelRegAuftrag, null); + if (this.panelRegAuftrag.Enabled == false) + { + this.pictureBoxPlus.Enabled = this.pictureBoxMinus.Enabled = this.textBoxCont.Enabled = true; + this.Width = textBoxKundeName.Right + 30; + this.Height = 470; + } + //PanelRegAuftrag_EnabledChanged(this.panelRegAuftrag, null); } else { @@ -341,7 +356,7 @@ namespace Deckungsbeitrag CustomInputBox inputBox = new CustomInputBox("Wieviel Stück sollen geliefert oder eingezogen werden?", "ARTIKELANZAHL", "Anzahl", "isNumeric"); if (inputBox.ShowDialog() == DialogResult.OK) { - anzahl = inputBox.text; + artAnzahl = int.Parse(inputBox.text); } else return; @@ -408,6 +423,7 @@ namespace Deckungsbeitrag { MessageBox.Show("Auswahl für den gewählten Kunden nicht verfügbar.", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error); this.comboBoxTyp.SelectedIndex = -1; + this.panelRegAuftrag.Enabled = false; return; } comboBoxArtikel.DataSource = kndartikel; @@ -541,7 +557,7 @@ namespace Deckungsbeitrag inputBox = new CustomInputBox("Wieviel Stück sollen geliefert oder eingezogen werden?", "ARTIKELANZAHL", "Anzahl", "isNumeric"); if (inputBox.ShowDialog() == DialogResult.OK) { - anzahl = inputBox.text; + artAnzahl = int.Parse(inputBox.text); } else return; } @@ -660,6 +676,7 @@ namespace Deckungsbeitrag id = null; artname = uca.ArtikelName.ToString(); } + AuftragArtikel aufart = new AuftragArtikel() { AuftragID = Auftrag.AuftragID, @@ -669,6 +686,7 @@ namespace Deckungsbeitrag Erledigt = false, Gesamt = uca.Anzahl, }; + aufart.Save(); } } diff --git a/AA-Klassen/Auftrag.cs b/AA-Klassen/Auftrag.cs index 7fb8566..7311ed8 100644 --- a/AA-Klassen/Auftrag.cs +++ b/AA-Klassen/Auftrag.cs @@ -886,6 +886,4 @@ namespace DatenDB } } } -//INSTALL-REMINDER: DB anpassen. (Priority in Auftrag etc.) -//CAHNGES: Priority wird bei Auftrag hinterlegt. Derzeit nach Fahrer Vorname bis andere Lösung gefunden. //TODO: Non-Hard-Coded-Lösung für Priority finden. \ No newline at end of file diff --git a/AA-Klassen/Funktionen.cs b/AA-Klassen/Funktionen.cs index a329a0a..02f7b90 100644 --- a/AA-Klassen/Funktionen.cs +++ b/AA-Klassen/Funktionen.cs @@ -45,9 +45,10 @@ namespace Deckungsbeitrag private static Benutzer _benutzer; private static PrintDocument printdoc; public static bool IsPhysicalPrint = false; // Globaler Schalter - static Dictionary _dictionary; + static object _dictionary; private static bool printed = false; private static bool inPreview = false; + private static int KundeID; public Funktionen() { @@ -863,7 +864,6 @@ namespace Deckungsbeitrag g.DrawString($"{auftrag.Liefertag.ToString("ddd dd.MM.")}", font1, Brushes.Black, startpoint.X, startpoint.Y + height_font1 + 5 + height_font2 + 2 + size_Liefertag.Height + 2); if (!nocont) g.DrawString($"{auftrag.ContainerClean}", font4, Brushes.Black, startpoint.X + size_Liefertag.Width + size_container.Width + 10, startpoint.Y + height_font1); - //TODO: Ausprobieren ob die Ausrichtung jetzt richtig ist. Sowohl beim ersten wie auch zweiten Mal. if (sender == null) bitmap.RotateFlip(RotateFlipType.Rotate90FlipNone); Image img = bitmap; return img; @@ -1083,12 +1083,9 @@ namespace Deckungsbeitrag } } } - public static Image SonderEtikett_Entwurf(Auftrag auftrag, Dictionary dictionary) + public static Image SonderEtikett_Entwurf(int KundeID, object dictionary) { - Kunde kunde = Kunde.GetKunde(string.Empty, auftrag.KundeID, string.Empty); - if (kunde.Suchtext.StartsWith("?") | kunde.KundeNummer == "2320000") kunde.Suchtext = auftrag.ZusatzInfo; - List artliste = AuftragArtikel.GetList(auftrag.AuftragID); - if (artliste == null || artliste.Count == 0) return null; + Kunde kunde = Kunde.GetKunde(string.Empty, KundeID, string.Empty); Bitmap bitmap = new Bitmap(300, 1200); Graphics g = Graphics.FromImage(bitmap); @@ -1109,37 +1106,66 @@ namespace Deckungsbeitrag //Etikett-Text g.DrawString($"{kunde.KundeNummer}", font2, Brushes.Black, startpoint); nextposition += (int)height_font2; - g.DrawString($"{kunde.Suchtext}", font2, Brushes.Black, einzug, nextposition); + g.DrawString($"{kunde.Suchtext.Substring(0, 10)}", font2, Brushes.Black, einzug, nextposition); nextposition += (int)height_font2; - g.DrawString($"{auftrag.Liefertag.Date.ToString("dd.MM.yyyy")}", font2, Brushes.Black, einzug, nextposition); + g.DrawString($"{DateTime.Today.Date:dd.MM.yyyy}", font2, Brushes.Black, einzug, nextposition); nextposition += (int)height_font2; g.DrawString("Artikel", font2, Brushes.Black, einzug, nextposition + 20); - nextposition += 20 + (int)height_font1; - g.DrawString("Rekl/NW/Stand/Inv", font3, Brushes.Black, bitmap.Width - g.MeasureString("Rekl/NW/Stand/Inv", font3).Width, nextposition + 10); - nextposition += (int)height_font2; + nextposition += 20 + (int)height_font2; - foreach (var kvp in dictionary) + switch (dictionary) { - KundeArtikel kndart = KundeArtikel.GetItem(kvp.Key); - Artikel _artikel = Artikel.GetArtikel(null, kndart.ArtikelID); - string artikelKey = _artikel.Bezeichnung; // z.B. "ART1" - int[] artbestand = kvp.Value; // z.B. [3, 0, 5] - string shortName = _artikel.Short; - float bestandWidth = g.MeasureString($"{artbestand[0].ToString()}/{artbestand[1].ToString()}/({artbestand[2].ToString()})/{artbestand[3].ToString()}", font3).Width; - g.DrawString($"{shortName}", font3, Brushes.Black, einzug, nextposition); - if (artbestand[2] < 0) g.DrawString($"{artbestand[0].ToString()}/{artbestand[1].ToString()}/({artbestand[2].ToString()})/{artbestand[3].ToString()}", font3, Brushes.Black, bitmap.Width - bestandWidth - 10, nextposition); - else g.DrawString($"{artbestand[0].ToString()}/{artbestand[1].ToString()}/{artbestand[2].ToString()}/{artbestand[3].ToString()}", font3, Brushes.Black, bitmap.Width - bestandWidth - 10, nextposition); - nextposition += (int)height_font1; + case Dictionary dictInt: + g.DrawString("REKL", font2, Brushes.Black, bitmap.Width - g.MeasureString("REKL", font2).Width, nextposition); + nextposition += (int)height_font2; + foreach (var kvp in dictInt) + { + KundeArtikel kndart = KundeArtikel.GetItem(kvp.Key); + Artikel _artikel = Artikel.GetArtikel(null, kndart.ArtikelID); + string artikelKey = _artikel.Bezeichnung; // z.B. "ART1" + int reklAnzahl = kvp.Value; // z.B. [3, 0, 5] + string shortName = _artikel.Short; + float bestandWidth = g.MeasureString($"{reklAnzahl}", font2).Width; + g.DrawString($"{shortName}", font2, Brushes.Black, einzug, nextposition); + nextposition += (int)height_font2; + g.DrawString($"{reklAnzahl}", font2, Brushes.Black, bitmap.Width - bestandWidth, nextposition); + nextposition += (int)height_font2; + } + break; + case Dictionary dictArray: + g.DrawString("IST/SOLL", font2, Brushes.Black, bitmap.Width - g.MeasureString("IST/SOLL", font2).Width, nextposition); + nextposition += (int)height_font2; + foreach (var kvp in dictArray) + { + KundeArtikel kndart = KundeArtikel.GetItem(kvp.Key); + Artikel _artikel = Artikel.GetArtikel(null, kndart.ArtikelID); + string artikelKey = _artikel.Bezeichnung; // z.B. "ART1" + int[] artbestand = kvp.Value; // z.B. [3, 0, 5] + int ist = artbestand[0] + artbestand[1]; + if (ist == 0 & artbestand[2] == 0) ist = artbestand[3]; + string shortName = _artikel.Short; + float bestandWidth = g.MeasureString($"{ist}/({artbestand[2]})", font2).Width; + g.DrawString($"{shortName}", font2, Brushes.Black, einzug, nextposition); + nextposition += (int)height_font2; + if (artbestand[2] < 0) g.DrawString($"{ist}/({artbestand[2]})", font2, Brushes.Black, bitmap.Width - bestandWidth - 10, nextposition); + else g.DrawString($"{ist}/{artbestand[2]}", font2, Brushes.Black, bitmap.Width - bestandWidth, nextposition); + nextposition += (int)height_font2; + } + break; + default: + throw new ArgumentException("Unbekannter Dictionary-Typ übergeben."); } + + Image img = bitmap; return img; } - public static DialogResult SonderEtikett_Drucken(Auftrag auftrag, Dictionary dictionary) + public static DialogResult SonderEtikett_Drucken(int kundeID, object dictionary) { - _auftrag = auftrag; _dictionary = dictionary; - int x = auftrag.ContainerClean; + KundeID = kundeID; + //int x = auftrag.ContainerClean; PrintDialog dialog = new PrintDialog(); PrintPreviewDialog preview = new PrintPreviewDialog(); @@ -1165,7 +1191,7 @@ namespace Deckungsbeitrag if (!printDocument.PrinterSettings.PrinterName.Contains(Properties.Settings.Default.Etikett_Drucker)) printDocument.DefaultPageSettings.PaperSize = new PaperSize("Etikett-Custom", 29, 90); dialog.Document = printDocument; - dialog.Document.DocumentName = "SonderEtikett"; + dialog.Document.DocumentName = "Sonder"; printDocument.Print(); @@ -1204,7 +1230,7 @@ namespace Deckungsbeitrag if (sender.ToString().Contains("Sonder")) { if (!inPreview) printed = true; - e.Graphics.DrawImage(SonderEtikett_Entwurf(_auftrag, _dictionary), e.PageBounds); + e.Graphics.DrawImage(SonderEtikett_Entwurf(KundeID, _dictionary), e.PageBounds); } if (sender.ToString().Contains("TourenListe")) { @@ -1500,7 +1526,6 @@ namespace Deckungsbeitrag chart1.ChartAreas[0].Position = new ElementPosition(0, 8, 100, 92); // Gesamtmenge als einzelne Säule (links oder transparent) - //TODO: Gesamt soll immer 100% sein. var serieGesamt = new Series("Gesamtmenge") { ChartType = SeriesChartType.StackedBar100, diff --git a/AA-Klassen/KundeArtikel.cs b/AA-Klassen/KundeArtikel.cs index 608eba8..3e5460f 100644 --- a/AA-Klassen/KundeArtikel.cs +++ b/AA-Klassen/KundeArtikel.cs @@ -97,7 +97,7 @@ namespace DatenDB List resultList = new List(); NpgsqlCommand command = new NpgsqlCommand(); command.Connection = DatenbankConnection.GetConnection(); - if (!string.IsNullOrWhiteSpace(kundeid)) command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kundeid} order by reihung asc"; + if (!string.IsNullOrWhiteSpace(kundeid)) command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kundeid} and SUBSTRING(artikel_nr::text, 1, 1) = '6' order by reihung asc"; else command.CommandText = $"select {COLUMNS} from {TABLE} where artikel_id = {artikelID} order by artikel_nr"; NpgsqlDataReader reader = command.ExecuteReader(); while (reader.Read()) resultList.Add(new KundeArtikel(reader)); diff --git a/Program.cs b/Program.cs index cfcf8ef..90ba6a5 100644 --- a/Program.cs +++ b/Program.cs @@ -42,71 +42,87 @@ namespace Deckungsbeitrag [DllImport("user32.dll")] private static extern int GetSystemMetrics(int nIndex); + [DllImport("user32.dll", SetLastError = true)] + private static extern uint GetRawInputDeviceList(IntPtr pRawInputDeviceList, ref uint puiNumDevices, uint cbSize); + private const int SM_DIGITIZER = 94; private const int SM_MAXIMUMTOUCHES = 95; private const int SM_CONVERTIBLESLATEMODE = 125; + private const int RIM_TYPEKEYBOARD = 1; + + [StructLayout(LayoutKind.Sequential)] + private struct RAWINPUTDEVICELIST + { + public IntPtr hDevice; + public uint dwType; + } public static readonly bool HasTouchHardware = (GetSystemMetrics(SM_DIGITIZER) & 0x80) != 0; public static readonly int TouchPoints = GetSystemMetrics(SM_MAXIMUMTOUCHES); public static readonly bool IsTabletMode = GetSystemMetrics(SM_CONVERTIBLESLATEMODE) == 1; - /// - /// **Hauptmethode**: Touch FUNKTIONIERT (Hardware + aktiviert) - /// public static bool IsTouchActive() { - // 1. Registry: TouchGate = 0 → deaktiviert if (IsRegistryDisabled()) return false; - - // 2. TouchPoints > 0 UND System sagt "Touch ready" if (TouchPoints <= 0) return false; - // 3. Windows Touch-Session aktiv? (SM_DIGITIZER bits) int digitizer = GetSystemMetrics(SM_DIGITIZER); - bool touchReady = (digitizer & 0x00000001) != 0; // Integrated touch? + bool touchReady = (digitizer & 0x00000001) != 0; bool penReady = (digitizer & 0x00000002) != 0; return touchReady || penReady; } - /// - /// Vollständig einsatzbereit - /// public static bool IsTouchDeviceReady() => HasTouchHardware && IsTouchActive(); - /// - /// Registry-Status - /// - private static bool IsRegistryDisabled() + // Prüft, ob ein Gerät vom Typ "Tastatur" vom System registriert ist + public static bool IsPhysicalKeyboardPresent() { - RegistryKey key = null; + uint deviceCount = 0; + uint size = (uint)Marshal.SizeOf(typeof(RAWINPUTDEVICELIST)); + + if (GetRawInputDeviceList(IntPtr.Zero, ref deviceCount, size) != 0) + return false; + + IntPtr pDevices = Marshal.AllocHGlobal((int)(size * deviceCount)); + try { - key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Wisp\TouchGate"); - if (key != null) + if (GetRawInputDeviceList(pDevices, ref deviceCount, size) == uint.MaxValue) + return false; + + for (int i = 0; i < deviceCount; i++) { - object value = key.GetValue("TouchGate"); - if (value != null && Convert.ToInt32(value) == 0) + RAWINPUTDEVICELIST device = (RAWINPUTDEVICELIST)Marshal.PtrToStructure( + new IntPtr(pDevices.ToInt64() + (size * i)), typeof(RAWINPUTDEVICELIST)); + + if (device.dwType == RIM_TYPEKEYBOARD) return true; } - return false; - } - catch - { - return false; } finally { - if (key != null) key.Close(); + Marshal.FreeHGlobal(pDevices); } + return false; } - /// - /// Debug-Status - /// + + private static bool IsRegistryDisabled() + { + using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Wisp\TouchGate")) + { + if (key != null) + { + object value = key.GetValue("TouchGate"); + return value != null && Convert.ToInt32(value) == 0; + } + } + return false; + } + public static string GetStatus() { - int digitizer = GetSystemMetrics(SM_DIGITIZER); - return $"Hardware: {HasTouchHardware}, Active: {IsTouchActive()}, Points: {TouchPoints}, RegistryDisabled: {IsRegistryDisabled()}, Digitizer: 0x{digitizer:X}"; + return $"Hardware: {HasTouchHardware}, TouchActive: {IsTouchActive()}, Keyboard: {IsPhysicalKeyboardPresent()}, Points: {TouchPoints}, TabletMode: {IsTabletMode}"; } } static class Program @@ -123,12 +139,14 @@ namespace Deckungsbeitrag //public static string vaultPath = @"N:\TECHNIK\Software\Wirl-Verwaltung\Feedback"; private static readonly string savePath = ConfigurationManager.AppSettings["DateiSavePfad"]; private static readonly bool istest = false; + public static bool istTouch = TouchHelper.IsTouchDeviceReady(); + public static bool hatTastatur = TouchHelper.IsPhysicalKeyboardPresent(); - /// - /// Der Haupteinstiegspunkt für die Anwendung. - /// - [STAThread] + /// + /// Der Haupteinstiegspunkt für die Anwendung. + /// + [STAThread] static void Main() { userid = ConfigurationManager.AppSettings["ConnectionString"].Split(';')[0]; diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index fd5d31e..c7d44ae 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, // indem Sie "*" wie unten gezeigt eingeben: -[assembly: AssemblyVersion("1.1.0.7")] -[assembly: AssemblyFileVersion("1.1.0.7")] +[assembly: AssemblyVersion("1.1.0.8")] +[assembly: AssemblyFileVersion("1.1.0.8")] diff --git a/SetupVerwaltung/SetupVerwaltung.vdproj b/SetupVerwaltung/SetupVerwaltung.vdproj index 598e8e6..2528817 100644 --- a/SetupVerwaltung/SetupVerwaltung.vdproj +++ b/SetupVerwaltung/SetupVerwaltung.vdproj @@ -34,37 +34,7 @@ "Entry" { "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" - "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" - "OwnerKey" = "8:_A41FC3BFD0E1CE905FCB1693E99348B8" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" - "OwnerKey" = "8:_C92C21BE3984A4EC1BCD3A988C56652E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" - "OwnerKey" = "8:_4E92FDDD15B89BB89053E8A65FA73EAA" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" - "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" - "OwnerKey" = "8:_8E444A9D7B7F9420CF44964B1EAE9AAA" + "OwnerKey" = "8:_99A1851DAB14095B2C6FFF6100D312B7" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -76,7 +46,37 @@ "Entry" { "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" - "OwnerKey" = "8:_99A1851DAB14095B2C6FFF6100D312B7" + "OwnerKey" = "8:_8E444A9D7B7F9420CF44964B1EAE9AAA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" + "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" + "OwnerKey" = "8:_4E92FDDD15B89BB89053E8A65FA73EAA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" + "OwnerKey" = "8:_C92C21BE3984A4EC1BCD3A988C56652E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" + "OwnerKey" = "8:_A41FC3BFD0E1CE905FCB1693E99348B8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0B016AD02A79C43C243D615B3AD40570" + "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -124,31 +124,7 @@ "Entry" { "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" - "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" - "OwnerKey" = "8:_A41FC3BFD0E1CE905FCB1693E99348B8" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" - "OwnerKey" = "8:_C92C21BE3984A4EC1BCD3A988C56652E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" - "OwnerKey" = "8:_4E92FDDD15B89BB89053E8A65FA73EAA" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" - "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" + "OwnerKey" = "8:_8A953E0634B8757038749C9F77062056" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -160,7 +136,31 @@ "Entry" { "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" - "OwnerKey" = "8:_8A953E0634B8757038749C9F77062056" + "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" + "OwnerKey" = "8:_4E92FDDD15B89BB89053E8A65FA73EAA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" + "OwnerKey" = "8:_C92C21BE3984A4EC1BCD3A988C56652E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" + "OwnerKey" = "8:_A41FC3BFD0E1CE905FCB1693E99348B8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4C0EEC06451FEA61E39F79681578838C" + "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -214,13 +214,13 @@ "Entry" { "MsmKey" = "8:_65AC8F9F13B5E0ADCA662A6618010328" - "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" + "OwnerKey" = "8:_125834DE4128EDE3F82BFC1A45B2ACD9" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_65AC8F9F13B5E0ADCA662A6618010328" - "OwnerKey" = "8:_125834DE4128EDE3F82BFC1A45B2ACD9" + "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -268,19 +268,7 @@ "Entry" { "MsmKey" = "8:_8A953E0634B8757038749C9F77062056" - "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_8A953E0634B8757038749C9F77062056" - "OwnerKey" = "8:_D3E738B1E9D7C3C737CDD91DCC4DC37B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_8A953E0634B8757038749C9F77062056" - "OwnerKey" = "8:_125834DE4128EDE3F82BFC1A45B2ACD9" + "OwnerKey" = "8:_8E444A9D7B7F9420CF44964B1EAE9AAA" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -292,7 +280,19 @@ "Entry" { "MsmKey" = "8:_8A953E0634B8757038749C9F77062056" - "OwnerKey" = "8:_8E444A9D7B7F9420CF44964B1EAE9AAA" + "OwnerKey" = "8:_125834DE4128EDE3F82BFC1A45B2ACD9" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8A953E0634B8757038749C9F77062056" + "OwnerKey" = "8:_D3E738B1E9D7C3C737CDD91DCC4DC37B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8A953E0634B8757038749C9F77062056" + "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -346,37 +346,7 @@ "Entry" { "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" - "OwnerKey" = "8:_A41FC3BFD0E1CE905FCB1693E99348B8" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" - "OwnerKey" = "8:_C92C21BE3984A4EC1BCD3A988C56652E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" - "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" - "OwnerKey" = "8:_4E92FDDD15B89BB89053E8A65FA73EAA" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" - "OwnerKey" = "8:_8E444A9D7B7F9420CF44964B1EAE9AAA" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" - "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" + "OwnerKey" = "8:_0B016AD02A79C43C243D615B3AD40570" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -388,7 +358,37 @@ "Entry" { "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" - "OwnerKey" = "8:_0B016AD02A79C43C243D615B3AD40570" + "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" + "OwnerKey" = "8:_8E444A9D7B7F9420CF44964B1EAE9AAA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" + "OwnerKey" = "8:_4E92FDDD15B89BB89053E8A65FA73EAA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" + "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" + "OwnerKey" = "8:_C92C21BE3984A4EC1BCD3A988C56652E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" + "OwnerKey" = "8:_A41FC3BFD0E1CE905FCB1693E99348B8" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -400,7 +400,7 @@ "Entry" { "MsmKey" = "8:_C2D67A4770D262B66069252CF1E903CF" - "OwnerKey" = "8:_D3E738B1E9D7C3C737CDD91DCC4DC37B" + "OwnerKey" = "8:_125834DE4128EDE3F82BFC1A45B2ACD9" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -412,7 +412,7 @@ "Entry" { "MsmKey" = "8:_C2D67A4770D262B66069252CF1E903CF" - "OwnerKey" = "8:_125834DE4128EDE3F82BFC1A45B2ACD9" + "OwnerKey" = "8:_D3E738B1E9D7C3C737CDD91DCC4DC37B" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -436,13 +436,13 @@ "Entry" { "MsmKey" = "8:_E637243CDA02D043DD2BAED063790F80" - "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" + "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" "MsmSig" = "8:_UNDEFINED" } "Entry" { "MsmKey" = "8:_E637243CDA02D043DD2BAED063790F80" - "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" + "OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -466,157 +466,7 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_848FCB2438E4DBC274C4D124CEB9562C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_16723AF5DFDEF26FC6A07BEB7D389737" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_65845AF9470C67B4E2216A46EFF4246C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_D3E738B1E9D7C3C737CDD91DCC4DC37B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_A41FC3BFD0E1CE905FCB1693E99348B8" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_C92C21BE3984A4EC1BCD3A988C56652E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_2DE2024BE0845063AAE50C820ED805AE" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_BDDC042CD8ACEF57F35D002490214D33" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_125834DE4128EDE3F82BFC1A45B2ACD9" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_65AC8F9F13B5E0ADCA662A6618010328" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_4E92FDDD15B89BB89053E8A65FA73EAA" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_8E444A9D7B7F9420CF44964B1EAE9AAA" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_99A1851DAB14095B2C6FFF6100D312B7" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_1B916DE951F447CD3C62E7AEBE228A3F" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_C2D67A4770D262B66069252CF1E903CF" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_8A953E0634B8757038749C9F77062056" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_17ABCA3C569C9181F3FE3A46B8638164" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_0B016AD02A79C43C243D615B3AD40570" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_4C0EEC06451FEA61E39F79681578838C" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_E637243CDA02D043DD2BAED063790F80" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_70C791195E1E3B637AE8CB0DE5BB4EFB" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_0014568666DC36A67BD4258FEDAE4805" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_8208B2126E1B253A2E427D55D4E5F13A" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_A2FA7AC58F6A16AB132434F8A00EA507" + "OwnerKey" = "8:_5CDE0A18B0E8657CBCF9143673DB464A" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -628,7 +478,157 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_5CDE0A18B0E8657CBCF9143673DB464A" + "OwnerKey" = "8:_A2FA7AC58F6A16AB132434F8A00EA507" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_8208B2126E1B253A2E427D55D4E5F13A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_0014568666DC36A67BD4258FEDAE4805" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_70C791195E1E3B637AE8CB0DE5BB4EFB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_C025D526FF076AA8036CB8B1A2BD888E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_E637243CDA02D043DD2BAED063790F80" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_4C0EEC06451FEA61E39F79681578838C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_0B016AD02A79C43C243D615B3AD40570" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_17ABCA3C569C9181F3FE3A46B8638164" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_8A953E0634B8757038749C9F77062056" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_C2D67A4770D262B66069252CF1E903CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_1B916DE951F447CD3C62E7AEBE228A3F" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_99A1851DAB14095B2C6FFF6100D312B7" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_8E444A9D7B7F9420CF44964B1EAE9AAA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_4E92FDDD15B89BB89053E8A65FA73EAA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_65AC8F9F13B5E0ADCA662A6618010328" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_EF6D58F917144384701E1DBDFB979BD8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_125834DE4128EDE3F82BFC1A45B2ACD9" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_BDDC042CD8ACEF57F35D002490214D33" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_2DE2024BE0845063AAE50C820ED805AE" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_C92C21BE3984A4EC1BCD3A988C56652E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_A41FC3BFD0E1CE905FCB1693E99348B8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_D3E738B1E9D7C3C737CDD91DCC4DC37B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_65845AF9470C67B4E2216A46EFF4246C" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_16723AF5DFDEF26FC6A07BEB7D389737" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_848FCB2438E4DBC274C4D124CEB9562C" "MsmSig" = "8:_UNDEFINED" } } @@ -733,11 +733,6 @@ "AssemblyAsmDisplayName" = "8:AForge.Video, Version=2.2.5.0, Culture=neutral, PublicKeyToken=cbfb6e07d173c401, processorArchitecture=MSIL" "ScatterAssemblies" { - "_0014568666DC36A67BD4258FEDAE4805" - { - "Name" = "8:AForge.Video.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:AForge.Video.dll" "TargetName" = "8:" @@ -764,11 +759,6 @@ "AssemblyAsmDisplayName" = "8:System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_0B016AD02A79C43C243D615B3AD40570" - { - "Name" = "8:System.Memory.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Memory.dll" "TargetName" = "8:" @@ -795,11 +785,6 @@ "AssemblyAsmDisplayName" = "8:Npgsql, Version=4.1.14.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7, processorArchitecture=MSIL" "ScatterAssemblies" { - "_125834DE4128EDE3F82BFC1A45B2ACD9" - { - "Name" = "8:Npgsql.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:Npgsql.dll" "TargetName" = "8:" @@ -826,11 +811,6 @@ "AssemblyAsmDisplayName" = "8:zxing.presentation, Version=0.16.11.0, Culture=neutral, PublicKeyToken=4e88037ac681fe60, processorArchitecture=MSIL" "ScatterAssemblies" { - "_16723AF5DFDEF26FC6A07BEB7D389737" - { - "Name" = "8:zxing.presentation.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:zxing.presentation.dll" "TargetName" = "8:" @@ -857,11 +837,6 @@ "AssemblyAsmDisplayName" = "8:HarfBuzzSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL" "ScatterAssemblies" { - "_17ABCA3C569C9181F3FE3A46B8638164" - { - "Name" = "8:HarfBuzzSharp.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:HarfBuzzSharp.dll" "TargetName" = "8:" @@ -888,11 +863,6 @@ "AssemblyAsmDisplayName" = "8:Microsoft.Bcl.HashCode, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_1B916DE951F447CD3C62E7AEBE228A3F" - { - "Name" = "8:Microsoft.Bcl.HashCode.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:Microsoft.Bcl.HashCode.dll" "TargetName" = "8:" @@ -919,11 +889,6 @@ "AssemblyAsmDisplayName" = "8:Spire.Barcode, Version=7.4.1.0, Culture=neutral, PublicKeyToken=663f351905198cb3, processorArchitecture=MSIL" "ScatterAssemblies" { - "_2DE2024BE0845063AAE50C820ED805AE" - { - "Name" = "8:Spire.Barcode.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:Spire.Barcode.dll" "TargetName" = "8:" @@ -970,11 +935,6 @@ "AssemblyAsmDisplayName" = "8:System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_4C0EEC06451FEA61E39F79681578838C" - { - "Name" = "8:System.Runtime.CompilerServices.Unsafe.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Runtime.CompilerServices.Unsafe.dll" "TargetName" = "8:" @@ -1001,11 +961,6 @@ "AssemblyAsmDisplayName" = "8:System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_4E92FDDD15B89BB89053E8A65FA73EAA" - { - "Name" = "8:System.Text.Encodings.Web.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Text.Encodings.Web.dll" "TargetName" = "8:" @@ -1052,11 +1007,6 @@ "AssemblyAsmDisplayName" = "8:System.Net.Sockets, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_5CDE0A18B0E8657CBCF9143673DB464A" - { - "Name" = "8:System.Net.Sockets.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Net.Sockets.dll" "TargetName" = "8:" @@ -1083,11 +1033,6 @@ "AssemblyAsmDisplayName" = "8:zxing, Version=0.16.11.0, Culture=neutral, PublicKeyToken=4e88037ac681fe60, processorArchitecture=MSIL" "ScatterAssemblies" { - "_65845AF9470C67B4E2216A46EFF4246C" - { - "Name" = "8:zxing.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:zxing.dll" "TargetName" = "8:" @@ -1114,11 +1059,6 @@ "AssemblyAsmDisplayName" = "8:System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_65AC8F9F13B5E0ADCA662A6618010328" - { - "Name" = "8:System.ValueTuple.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.ValueTuple.dll" "TargetName" = "8:" @@ -1145,11 +1085,6 @@ "AssemblyAsmDisplayName" = "8:System.Runtime.InteropServices.RuntimeInformation, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_6A4E9AB7C92A8099AD635862468BFCBE" - { - "Name" = "8:System.Runtime.InteropServices.RuntimeInformation.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Runtime.InteropServices.RuntimeInformation.dll" "TargetName" = "8:" @@ -1176,11 +1111,6 @@ "AssemblyAsmDisplayName" = "8:AForge.Video.DirectShow, Version=2.2.5.0, Culture=neutral, PublicKeyToken=61ea4348d43881b7, processorArchitecture=MSIL" "ScatterAssemblies" { - "_70C791195E1E3B637AE8CB0DE5BB4EFB" - { - "Name" = "8:AForge.Video.DirectShow.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:AForge.Video.DirectShow.dll" "TargetName" = "8:" @@ -1207,11 +1137,6 @@ "AssemblyAsmDisplayName" = "8:AForge, Version=2.2.5.0, Culture=neutral, PublicKeyToken=c1db6ff4eaa06aeb, processorArchitecture=MSIL" "ScatterAssemblies" { - "_8208B2126E1B253A2E427D55D4E5F13A" - { - "Name" = "8:AForge.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:AForge.dll" "TargetName" = "8:" @@ -1238,11 +1163,6 @@ "AssemblyAsmDisplayName" = "8:VirtualKeyboard, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL" "ScatterAssemblies" { - "_848FCB2438E4DBC274C4D124CEB9562C" - { - "Name" = "8:VirtualKeyboard.exe" - "Attributes" = "3:512" - } } "SourcePath" = "8:VirtualKeyboard.exe" "TargetName" = "8:" @@ -1269,11 +1189,6 @@ "AssemblyAsmDisplayName" = "8:System.Threading.Tasks.Extensions, Version=4.2.4.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_8A953E0634B8757038749C9F77062056" - { - "Name" = "8:System.Threading.Tasks.Extensions.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Threading.Tasks.Extensions.dll" "TargetName" = "8:" @@ -1300,11 +1215,6 @@ "AssemblyAsmDisplayName" = "8:System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_8E444A9D7B7F9420CF44964B1EAE9AAA" - { - "Name" = "8:System.IO.Pipelines.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.IO.Pipelines.dll" "TargetName" = "8:" @@ -1331,11 +1241,6 @@ "AssemblyAsmDisplayName" = "8:Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL" "ScatterAssemblies" { - "_99A1851DAB14095B2C6FFF6100D312B7" - { - "Name" = "8:Microsoft.Extensions.Logging.Abstractions.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:Microsoft.Extensions.Logging.Abstractions.dll" "TargetName" = "8:" @@ -1362,11 +1267,6 @@ "AssemblyAsmDisplayName" = "8:System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" "ScatterAssemblies" { - "_A2FA7AC58F6A16AB132434F8A00EA507" - { - "Name" = "8:System.Net.Http.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Net.Http.dll" "TargetName" = "8:" @@ -1393,11 +1293,6 @@ "AssemblyAsmDisplayName" = "8:System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_A41FC3BFD0E1CE905FCB1693E99348B8" - { - "Name" = "8:System.Diagnostics.DiagnosticSource.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Diagnostics.DiagnosticSource.dll" "TargetName" = "8:" @@ -1424,11 +1319,6 @@ "AssemblyAsmDisplayName" = "8:ObjectListView, Version=2.9.3.0, Culture=neutral, processorArchitecture=MSIL" "ScatterAssemblies" { - "_BDDC042CD8ACEF57F35D002490214D33" - { - "Name" = "8:ObjectListView.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:ObjectListView.dll" "TargetName" = "8:" @@ -1455,11 +1345,6 @@ "AssemblyAsmDisplayName" = "8:System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_C025D526FF076AA8036CB8B1A2BD888E" - { - "Name" = "8:System.Buffers.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Buffers.dll" "TargetName" = "8:" @@ -1486,11 +1371,6 @@ "AssemblyAsmDisplayName" = "8:Microsoft.Bcl.AsyncInterfaces, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_C2D67A4770D262B66069252CF1E903CF" - { - "Name" = "8:Microsoft.Bcl.AsyncInterfaces.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:Microsoft.Bcl.AsyncInterfaces.dll" "TargetName" = "8:" @@ -1517,11 +1397,6 @@ "AssemblyAsmDisplayName" = "8:System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_C92C21BE3984A4EC1BCD3A988C56652E" - { - "Name" = "8:System.Collections.Immutable.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Collections.Immutable.dll" "TargetName" = "8:" @@ -1548,11 +1423,6 @@ "AssemblyAsmDisplayName" = "8:System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_D3E738B1E9D7C3C737CDD91DCC4DC37B" - { - "Name" = "8:System.Threading.Channels.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Threading.Channels.dll" "TargetName" = "8:" @@ -1579,11 +1449,6 @@ "AssemblyAsmDisplayName" = "8:System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" "ScatterAssemblies" { - "_E637243CDA02D043DD2BAED063790F80" - { - "Name" = "8:System.Numerics.Vectors.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Numerics.Vectors.dll" "TargetName" = "8:" @@ -1610,11 +1475,6 @@ "AssemblyAsmDisplayName" = "8:System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL" "ScatterAssemblies" { - "_EF6D58F917144384701E1DBDFB979BD8" - { - "Name" = "8:System.Text.Json.dll" - "Attributes" = "3:512" - } } "SourcePath" = "8:System.Text.Json.dll" "TargetName" = "8:" @@ -1690,15 +1550,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:SetupVerwaltung" - "ProductCode" = "8:{6D13C83E-FAD0-4B29-BBEC-E1ABCEAAFB03}" - "PackageCode" = "8:{32CA7B7D-CFC8-41EA-A986-11D890FE499A}" + "ProductCode" = "8:{A52B48F7-18F7-4B26-87AF-63C7BADA67C1}" + "PackageCode" = "8:{A8177456-8491-4BFE-ADEF-5DA58C61D3D4}" "UpgradeCode" = "8:{2DC7CE56-8D1C-42EB-B326-2E887EBB7F5A}" "AspNetVersion" = "8:" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.1.07" + "ProductVersion" = "8:1.1.08" "Manufacturer" = "8:Kilian Wirl GmbH" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/UserControls/UCFeedback.cs b/UserControls/UCFeedback.cs index d2f247d..692c43e 100644 --- a/UserControls/UCFeedback.cs +++ b/UserControls/UCFeedback.cs @@ -59,7 +59,6 @@ namespace Deckungsbeitrag.UserControls bildDateiname = $"feedback-{timestamp}.png"; string bildPath = Path.Combine("N:\\TECHNIK\\Software\\Wirl-Verwaltung\\Feedback", bildDateiname); - //TODO: Warum der falsche Path? Immer mit \\ string tempPath = Path.Combine(Path.GetTempPath(), Path.GetFileName(bildPath)); try diff --git a/UserControls/UCInventur.cs b/UserControls/UCInventur.cs index f170cb6..f5ced00 100644 --- a/UserControls/UCInventur.cs +++ b/UserControls/UCInventur.cs @@ -220,7 +220,7 @@ namespace Deckungsbeitrag.UserControls this.auftrag.Liefertag = dTPLieferDat.Value; foreach (DataGridViewRow row in this.dGArtikel.Rows) { - // KundeArtikel updaten. Neuen Stand eintragen, Reklamation & Fehlmenge auf Null setzten und Korrektur als InventruAusgleich speichern. + // KundeArtikel updaten. Neuen Stand eintragen, Reklamation & Fehlmenge auf Null setzten und Korrektur als InventurAusgleich speichern. KundeArtikel art = (KundeArtikel)artikelListe[row.Index]; art.Reklamation = 0; @@ -468,6 +468,7 @@ namespace Deckungsbeitrag.UserControls DataGridView_GetNewSize(this.dGArtikel); this.buttonFreigeben.Visible = true; this.labelInvText.Visible = false; + if (this.user.Rolle == BenutzerRolle.Verwaltung || this.user.Rolle == BenutzerRolle.Admin) Tosave = true; } } @@ -485,11 +486,10 @@ namespace Deckungsbeitrag.UserControls if (row.Cells[j].Value == null) row.Cells[j].Value = 0; iststand += int.TryParse(row.Cells[j].Value.ToString(), out int r) ? r : 0; } - if (e.ColumnIndex >= 7 || e.ColumnIndex == 2) { row.Cells[5].Value = sollstand - fehlmenge - iststand; - row.Cells[6].Value = artikelListe[e.RowIndex].Korrektur = sollstand - iststand; + row.Cells[6].Value = artikelListe[e.RowIndex].Korrektur = sollstand - iststand - fehlmenge; //DONE: INV-Ausgleich (Korrektur) = Sollstand - Iststand (Bei Kunde & Lieferungen) - fehlmenge (Reklamation & Nachwäsche) } } else return; diff --git a/UserControls/UCKunde.cs b/UserControls/UCKunde.cs index 17644e9..960d9f2 100644 --- a/UserControls/UCKunde.cs +++ b/UserControls/UCKunde.cs @@ -93,5 +93,4 @@ namespace Deckungsbeitrag.UserControls } } } -} -//TODO: Design des Controls anpassen. Eventuell im Designer erstellen. \ No newline at end of file +} \ No newline at end of file diff --git a/Verwaltung_ReadMe.txt b/Verwaltung_ReadMe.txt index e8384ba..1075880 100644 --- a/Verwaltung_ReadMe.txt +++ b/Verwaltung_ReadMe.txt @@ -1,15 +1,15 @@ ===================================== -NEUIGKEITEN - Version 1.1.0.7 +NEUIGKEITEN - Version 1.1.0.8 ===================================== Build-Info: - Build-Typ: Release Build -- Erledigte TODOs: 6 -- Offene TODOs: 25 -- Install-Reminders: 1 -- Changes: 29 +- Erledigte TODOs: 7 +- Offene TODOs: 18 +- Install-Reminders: 0 +- Changes: 31 -=== ✨ CHANGES (29) === +=== ✨ CHANGES (31) === ## ArtikelVW.cs ## - ✨ Reklamation als Spalte hinzugefügt und Anzeigen implementiert. Sowohl bei KundeArtikel als auch bei NW_Artikel. @@ -20,8 +20,10 @@ Build-Info: - ✨ 2. Änderungen werden nur gespeichert wenn ein Etikett gedruckt wurde. - ✨ 3. Abschließen nur möglich wenn alle Artikel auf 0 sind (Checked) und gespeichert wurde. - ✨ Bei Druckabbruch wird die geänderte Zahl NICHT zurückgesetzt. (Das muss händisch erfolgen) +- ✨ Beim Speichern ohne Abschließen schließt sich das Fenster nach dem Speichern. - ✨ Wenn die reduzierte Anzahl bei SOLL-Verminderung nicht negativ ist, wird diese negativ gemacht. So wird ein möglicher Fehler ausgebessert. - ✨ Wenn die Zahlen zurückgesetzt werden sollen, muss AuftragDetail geschlossen werden. +- ✨ Wenn ein Artikel vollständig hergerichtet wird, muss er nur abgehackt werden. Den Rest macht der Computer. ## Expedit.cs ## @@ -67,8 +69,7 @@ Build-Info: - ✨ Wenn der Lieferrhythmus geändert wird, werden KundenControls an falschen Tagen gelöscht. -=== ⚙️ INSTALL-REMINDER (1) === -- ⚙️ DB anpassen. (Priority in Auftrag etc.) [Auftrag.cs] +Keine Install-Reminder vorhanden ✅ -Installation: 29.04.2026 17:53 +Installation: 05.05.2026 13:36 ===================================== diff --git a/VirtualKeyboard/Properties/AssemblyInfo.cs b/VirtualKeyboard/Properties/AssemblyInfo.cs index d5c5b07..75ead48 100644 --- a/VirtualKeyboard/Properties/AssemblyInfo.cs +++ b/VirtualKeyboard/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ using System.Runtime.InteropServices; // Buildnummer // Revision // -[assembly: AssemblyVersion("1.0.1.2")] -[assembly: AssemblyFileVersion("1.0.1.2")] +[assembly: AssemblyVersion("1.0.1.3")] +[assembly: AssemblyFileVersion("1.0.1.3")] diff --git a/VirtualKeyboard/QwertzKeyboard.cs b/VirtualKeyboard/QwertzKeyboard.cs index 90932a9..d77b12b 100644 --- a/VirtualKeyboard/QwertzKeyboard.cs +++ b/VirtualKeyboard/QwertzKeyboard.cs @@ -24,7 +24,7 @@ namespace VirtualKeyboard new Button[14], new Button[14], new Button[14], new Button[14], new Button[8]}; // **Echtes QWERTZ-Layout** (5 Reihen + Funktion/Steuerung) private string[] qwertzRows = { - " 1234567890ß⌫↵", // Ziffernreihe + "?1234567890ß⌫↵", // Ziffernreihe "↔qwertzuiopü+", // Hauptbuchstaben 1 (versetzt) " asdfghjklöä#", // Hauptbuchstaben 2 (versetzt) "⇧