Jeder hat das Problem, dass eingegebene Daten validiert werden müssen, bevor sie in der Datenbank abgelegt werden. Der Anwender soll bereits bei der Eingabe entsprechende Hinweise zu seinen Eingaben erhalten. Unten habe ich mal eine kleine Einführung für eine der vielen möglichen Varianten der Datenvalidierung aufgeführt. Der Text ist etwas rudimentär ich hoffe es hilft trotzdem bei der Entwicklung:
Im Beispiel wurde eine ganz normale WPF-Anwendung erstellt. In das Projekt wurde eine LINQ to SQL- oder Linq to Entities-Klasse aufgenommen um einen Datacontext für den Zugriff auf die Datenbank zu haben.
Textbox-Control im XAML:
- Databinding ganz normal an ein Object mit InotifyPropertyChanged-Events z.b. direkt Objekte aus dem DataContext
- Nach der Prüfung wird bei einem Fehler die Fehlermessage als Tooltip angezeigt
- Optional könnte man den Style im Fehlerfall noch anpassen – default ist ein roter Rand
<TextBox Margin=”5,5,5,5″ Grid.Column=”1″ TextWrapping=”Wrap” Text=”{ Binding NoDEPC,ValidatesOnExceptions=True, NotifyOnValidationError=true }” Validation.Error=”TextBox_Error”>
</TextBox>
Eventhandler für Fehler in der Datenvalidierung im Codebehind oder im Template….
private
void TextBox_Error(object sender,
ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
((Control)sender).ToolTip = e.Error.Exception.InnerException.Message.ToString();
}
else
{
((Control)sender).ToolTip = “”;
}
}
Das gebundene Object z.B. aus dem Datacontext muss erweitert werden:
Hier: gebundenes Feld NoDEPC
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Business;
using System.Collections;
namespace Business
{
// die EntityKlasse, die vom LINQ-Designer generiert
// wurde, wird hier noch erweitert
public partial class Profit_Center
{
public void SetDefaultValues()
{
ID_ProfitCenter = Guid.NewGuid();
NoDesoursys = “99″;
NoDeco_Area = “XXXXX”;
PNSourSys = “33″;
PNCo_Area = “05″;
IsActive = true;
IsTemplate = false;
}
// überschriebene erweiterte Methode aus der Klasse
partial void OnNoDEPCChanged()
{
// sobald das property geändert wird
//z.B. durchs Verlassen der Textbox
// läuft die Regelprüfung
CheckNodePC(this.NoDEPC);
}
//eigentliche Regelprüfung in der klasse
public string CheckNodePC(string Nodename)
{
string msg = “”;
if(Nodename== null || Nodename== “”)
msg = “Profitcenternamen dürfen nicht leer sein “; if(Nodename.Contains(” “)== true)
msg += “Profitcenternamen dürfen keine Leerstellen enthalten”;
if (msg !=“”)
{
// exception auslösen damit die message auch
//an die GUI kommt
throw new ArgumentOutOfRangeException(msg);
return msg;
}
}
}