Validierungsproblem

17/10/2008 - 07:54 von Sven Becker | Report spam
Hallo NG,

für folgendes Problem habe ich trotz intensiver Internet-Recherche und
Rumprobiererei kein Lösung gefunden:

Ich benutze VB2005/VS2005 Prof

Ich habe eine Datenklasse, deren Inhalt ich in einem Winform anzeigen und
veràndern lassen will. Diese Datenklasse habe ich als Datenquelle registriert
und eine BindingSource im Winform angelegt. Der Datenaustausch funktioniert
auch einwandfrei.
Ich würde nun gern die Validierung der Daten in der Datenklasse vornehmen
und dem Anwender bei ungültigen Eingaben eine entsprechende Meldung anzeigen,
idealerweise in Form eines ErrorProviders, bekomme aber besagte Fehlermeldung
nicht ins Form. Wie kann ich das lösen?

Anbei ein bischen Quelltext:

Datenklasse

public class Daten
dim m_wert as integer
public property wert as integer
get
return wert
end get
set (value as integer)
if value < 5 then
throw new system.Exception("Wert muss größer 4 sein")
return
end if
m_wert = value
end set
end class

Die Exception bewirkt tatsàchlich, daß die Eingabe ncicht angenommen wird
und ich die TextBox nicht verlassen kann. Aber wie kann ich die von mir
übergebene Exception-Message anzeigen.
Habe schon unter anderem schon das DataError-Ereignis der BindingSource
ausgewertet - ohne Erfolg.

Kann mir jemand helfen?

Danke,
Sven
 

Lesen sie die antworten

#1 Peter Götz
17/10/2008 - 10:22 | Warnen spam
Hallo Sven,


für folgendes Problem habe ich trotz intensiver
Internet-Recherche und Rumprobiererei kein
Lösung gefunden:



Um notwendige Grundlagen zu erlernen ist ein
entspr. für den Einstieg in die jeweilige Programmier-
sprache konzipiertes Buch immer noch das am
besten geeignete Mittel.

Ich benutze VB2005/VS2005 Prof

Ich habe eine Datenklasse, deren Inhalt ich in einem
Winform anzeigen und veràndern lassen will.



Welchen "Inhalt" stellt denn diese Datenklasse zur
Verfügung? "Datenklasse" ist ein sehr dehnbarer
Begriff und sagt so weder was über die Funktionalitàt
noch über die bereitgestellten Daten aus.


Diese Datenklasse habe ich als Datenquelle
registriert und eine BindingSource im Winform
angelegt.



Wozu brauchst Du diese BindingSource?


Der Datenaustausch funktioniert auch einwandfrei.



Datenaustausch zwischen welchen Endpunkten?
Und funktioniert er auch effizient und ohne überflüssigen
Code-Ballast?

Ich würde nun gern die Validierung der Daten in
der Datenklasse vornehmen und dem Anwender
bei ungültigen Eingaben eine entsprechende
Meldung anzeigen, idealerweise in Form eines
ErrorProviders, bekomme aber besagte Fehlermeldung
nicht ins Form. Wie kann ich das lösen?

Anbei ein bischen Quelltext:

Datenklasse

public class Daten
dim m_wert as integer
public property wert as integer
get
return wert
end get
set (value as integer)
if value < 5 then
throw new system.Exception("Wert muss größer 4 sein")



Nachdem Du mit throw ... eine Exception ausgelöst hast,
ist hier Ende der Fahnenstange, weiterer Code innerhalb
dieser Prozedur wird nicht mehr ausgeführt.

return
end if
m_wert = value
end set
end class

Die Exception bewirkt tatsàchlich, daß die Eingabe
ncicht angenommen wird und ich die TextBox
nicht verlassen kann.



Welche Textbox?


Aber wie kann ich die von mir übergebene
Exception-Message anzeigen.



Die in Deiner Property-Prozedur ausgelöste Exception
muss der Programmteil erkennen und auswerten, der
eben diese Property aufgerufen hat.


Erstelle Dir mal ein Projekt mit dem nachfolgenden
Klassenmodul (SampleClass) und einem Formmodul.

' /// Code in Klassenmodul SampleClass.vb
Public Class SampleClass
Private mClassName As String = "SampleClass"
Public mNumber As Integer

Public Property Number() As Integer
Get
Return mNumber
End Get
Set(ByVal value As Integer)
Select Case value
Case 1 To 25
mNumber = value
Case Else
' OutOfRangeException erzeugen
Dim AEx As _
New ArgumentOutOfRangeException _
("value", "Valid range 1 ... 25")

' Neue Exception auslösen, welcher AEx
' als InnerException übergeben wurde.
Throw New Exception _
(mClassName & ".Property Set Number", AEx)
End Select
End Set
End Property
End Class
' \\\ _____________


' /// Code in einem leeren Form1-Modul
Public Class Form1
Private mSC As SampleClass
Private WithEvents mButton As Button
Private mRnd As New Random


Private Sub Form1_Load _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.Load

' innere Formflàche festlegen
Me.ClientSize = New Size(400, 300)

' FormBorderStyle festlegen
Me.FormBorderStyle = _
Windows.Forms.FormBorderStyle.Fixed3D

' Instanz einer SampleClass erstellen
mSC = New SampleClass

' Button erstellen
mButton = New Button
With mButton
.SetBounds _
(Me.ClientSize.Width \ 2 - 50, _
Me.ClientSize.Height \ 2 - 25, _
100, 50)

.Font = New Font("Arial", 10)
.Text = "New Rnd-Number"
End With
' ... und den Button der Forms-Auflistung
' hinzufügen.
Me.Controls.Add(mButton)
End Sub


Private Sub mButton_Clickn _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles mButton.Click

' Zufàllige Zahl im Bereich 0 bis 50 erzeugen
Dim RndNumber As Integer = _
mRnd.Next(0, 50)
Me.Text = RndNumber.ToString

' Zufallszahl an mSC.Number übergeben
Try
mSC.Number = RndNumber
Catch ex As Exception
ShowException(ex)
End Try
End Sub

''' <summary>
''' Zeigt Exception-Messages inkl. der in
''' Exc enthaltenen InnerExceptions.
''' </summary>
''' <param name="Exc"></param>
''' <remarks></remarks>
Private Sub ShowException(ByVal Exc As Exception)
Dim Msg As String = ""

Do While Exc IsNot Nothing
If Msg.Length > 0 Then
Msg &= ControlChars.CrLf & ControlChars.CrLf
End If
Msg &= Exc.Message

If Exc.InnerException IsNot Nothing Then
Dim InEx As Exception = Exc.InnerException
Exc = New Exception(InEx.Message, InEx.InnerException)
Else
Exc = Nothing
End If
Loop
MsgBox(Msg, MsgBoxStyle.Exclamation)
End Sub

End Class
' \\\ E N T E


Programm starten und auf den Button "New Rnd-Number"
klicken und klicken und klicken und ...

Mit jedem Button_Click wird eine Zufallszahl im Bereich
von 0 bis 50 erzeugt und in der Form-Titelleiste an-
gezeigt. Ebenso wird diese Zufallszahl an die Eigenschaft
"Number" der Klasse SampleClass (mSC) übergeben.

Die Eigenschaft Number erwartet Werte im Bereich von
1 bis 25, andere Werte sollen durch Auslösen einer
Exception abgewiesen werden.

Erhàlt die "Property Set Number"- Prozedur einen
Wert im Bereich 1 bis 25, ist alles ok, der Wert
wird in die interne Variable mNumber übernommen.
Liegt der Wert jedoch ausserhalb dieses Bereiches
wird eine OutOfRangeException AEx erzeugt und implizit
mit ThrowException eine weitere neue Exception.
Diese erhàlt als Exception.Message den Klassen-
namen mClassName und den Namen der auslösenden
Prozedur (".Property Set Number") und an Innerexception
dieses Exception-Objektes wird ein Verweis auf AEx
übergeben.

Die Übergabe der Zufallszahl in der Sub mButton_Click
des Formmoduls an die Eigenschaft "Number" der Klasse
SampleClass (mSC) erfolgt in einem Try-Catch-Block.
Werden Zahlen im Bereich 1 ... 25 übergeben, übernimmt
das Klassenmodul diesen Wert ohne Beanstandung,
liegt der Wert ausserhalb dieses Bereiches löst die
Property-Set-Prozedur in SampleClass.vb eine Exception
(mit InnerException) aus und diese wird in Catch-Abschnitt
des Try-Catch-Blockes erkannt und es wird mit Hilfe der
Sub ShowException eine Fehlermeldung ausgegeben, die
eine MsgBox mit dem Fehlerort (Exception.Message,
Modul- u. Prozedurname) und einem Hinweis zum eigentlichen
Fehler (ex.InnerException.Message) enthàlt.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen