Laden...

auf korrekte Eingaben prüfen

Erstellt von kstanger vor einem Jahr Letzter Beitrag vor einem Jahr 786 Views
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr
auf korrekte Eingaben prüfen

Hallo,

ich habe ein DGV, in dem ich per Programmierung eine neue Zeile einfüge. (DGV ist gebunden per BindingSource, die wiederum mit einer Liste von Objekten verbunden ist.) Ich stelle dabei sicher, dass in der Zeile nur gültige Daten sind. Der User soll aber die Daten ändern, zumindest einen Namen. Dieser Name darf nur alphanumerische Zeichen, Umlaute, ß und Leerzeichen oder Bindestrich enthalten, sofern diese von den alphanumerischen Zeichen "umrahmt" sind. Die Prüfung dazu führe ich per Regex mit einem entsprechenden Pattern durch. All dies funktioniert soweit.
Wenn der User etwas ändert, dann ist er in der entsprechenden Zelle im Editiermodus. Sobald er die Zelle verlassen will, soll das nur erlaubt sein, wenn seine Änderung die o.g. Forderung erfüllt. Ich habe dazu den CellValidating-Handler bemüht; das funktioniert aber nicht richtig. Der User muss quasi die Zelle verlassen. dann nochmal aufrufen und erst dann beim Verlassen wird die Meldung angezeigt.


        private void DataGridViewFarbe_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (DataGridViewFarbe.Columns[e.ColumnIndex] == DataGridViewFarbe.Columns["Farbname"])
            {
                string patternFarbname = @"^[a-zäöüA-ZÄÖÜ0-9](( |-)?[a-zßäöüA-ZÄÖÜ0-9])*$";
                MatchCollection match = Regex.Matches(DataGridViewFarbe.CurrentCell.Value.ToString(), patternFarbname);
                if (match.Count > 0)
                {
                    return;
                }
                else
                {
                    MessageBox.Show("Fehler: #" + DataGridViewFarbe.CurrentCell.Value.ToString() + "# nicht erlaubt");
                    return;
                }
            }
            return;
        }

Fragen:
Welcher Handler oder Kombination von Handlern ist hier angebracht?

Karl Stanger
J
61 Beiträge seit 2020
vor einem Jahr

Mein Tipp: Debugger benutzen!

Auch wenn ich das DGV nicht kenne, so erwarte ich, dass im CellValidating Ereigniss der vom Nutzer eingegebene Wert noch nicht in der Zelle gesetzt ist. Denn vorher muss der neue vorgeschlagene Wert ja erst noch geprüft werden.

Daher vermute ich, dass


DataGridViewFarbe.CurrentCell.Value.ToString()

durch


e.FormattedValue.ToString()

ersetzt werden muss.

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Das war genau der richtige Tipp! Ich habe das jetzt so programmiert und noch ein e.Cancel eingefügt, damit die Zelle nicht verlassen wird.


        private void DataGridViewFarbe_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            if (DataGridViewFarbe.Columns[e.ColumnIndex] == DataGridViewFarbe.Columns["Farbname"])
            {
                string patternFarbname = @"^[a-zäöüA-ZÄÖÜ0-9](( |-)?[a-zßäöüA-ZÄÖÜ0-9])*$";
                MatchCollection match = Regex.Matches(e.FormattedValue.ToString(), patternFarbname);
                if (match.Count > 0)
                {
                    return;
                }
                else
                {
                    MessageBox.Show("Fehler: #" + e.FormattedValue.ToString() + "# nicht erlaubt");
                    e.Cancel = true;
                    return;
                }
            }
            return;
        }

Vielen Dank für die Hilfe.

Karl Stanger
16.834 Beiträge seit 2008
vor einem Jahr

Alles nichts neues, auch dieses Problem sehr gut dokumentiert.
How to: Validate Data in the Windows Forms DataGridView Control - man muss es nur lesen.
Zusätzlich: Walkthrough: Validate data in DataGridView control - Windows Forms .NET Framework