Laden...

ErrorProvider Control und UserControls

Erstellt von Timur Zanagar vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.816 Views
Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 13 Jahren
ErrorProvider Control und UserControls

Hallo an alle,

Ich habe hier eine Windows Forms mit einem Tab Control und in diesem Tab Control gibt es TabPages, die eine User Control anzeigen oder aber auch "normale" Controls wie TextBox angezeigt wird.

In diesem UserControl sind wiederkehrende Elemente zusammengefasst.

Das Problem ist das ich beim Data Binding den ErrorProvider benutze und die Anzeige gerne ändern möchte.

Bei einer TextBox (nicht im User Control) wird der "Fehler" so angezeigt:

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 13 Jahren

Bei meinem UserControl (ist ja auch verständlich) wird es auch neben dem Control angezeigt. Aber wie bekomme ich es hin, dass der Fehler neben der entsprechenden TextBox erscheint?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Timur Zanagar,

ich denke, dass du in dem UserControl für jede TextBox auch einen eigenen Error-Provider hinzufügen muss. Sinnvollerweise sollte sich dann auch das UserControl selbst darum kümmern, dass der Fehler an der richtigen Stelle angezeigt wird.

herbivore

5.299 Beiträge seit 2008
vor 13 Jahren

reicht ein EP im UserControl, jdfs, wenn man mit IDataErrorInfo arbeitet.

Der frühe Apfel fängt den Wurm.

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 13 Jahren

Ich musste nun meine Vorgehensweise ändern. Seither hatte ich die TextBox.Text als Property nach aussen sichtbar gemacht um dort über die BindingSource ein DataBinding durchzuführen. Nun habe ich im UserControl auch eine BindingSource und einen ErrorProvider. Die Properties greifen nun nicht direkt auf die TextBox zu sondern auf die DataSource (ViewModel).

Nun werden auch die ErrorProvider korrekt angezeigt. Das einzige was ich nun entfernen muss, ist der ErrorProvider um die komplette UserControl. Mal schauen ob es eine Möglichkeit gibt um dies zu excluden.

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 13 Jahren

Also langsam verzweifele ich .... .

Das Data Binding im UserControl inkl. dem Error Provider funktioniert ohne Probleme. Das Problem ist nun lediglich, dass die geänderten Daten an die Form bzw. an dessen BindingSource nicht übergeben werden. Auch die Tatsache das die ViewModels INotifyPropertyChanged und IDataErrorInfo implementiert haben und das Data Binding auf OnPropertyChanged gestellt ist, glaube ich das es daran liegt dass das Binding Source im UserControl klar kein Binding Source EndEdit durchführt.

Das wiederum sagt mir eigentlich das diese Vorgehensweise 2 BindingSources zu verwenden eigentlich Quatsch ist. Wie löst Ihr dieses Problem? Wie ist eure Vorgehensweise?

5.299 Beiträge seit 2008
vor 13 Jahren

... das diese Vorgehensweise 2 BindingSources zu verwenden eigentlich Quatsch ist.

Naja, wenn du was zusammen-binden willst, musses natürlich an dieselbe Bindingsource.

Wie löst Ihr dieses Problem? Wie ist eure Vorgehensweise?

Ich designe das UC mit eigenem Dataset und BindingSource, und zur Laufzeit reiche ich das richtige Dataset rein, und stöpsel um.
Das kann man sogar vereinfachen, indem man auf dem UCl die Bindingsources nicht direkt ans Dataset mache, sondern eine "MainbindingSource" (ohne Datamember) dazwischen schalten.
Dann kann ich zur Laufzeit das Dummi-Dataset durch das richtige Dataset ersetzen. Auf DataBinding-Uebungen ist das mit mehreren Forms getrieben, aber vonne Logik her ist das dasselbe wie mit UserControls.

Der frühe Apfel fängt den Wurm.

160 Beiträge seit 2008
vor 13 Jahren

Hallo,

  1. du hast eine Business Class, sprich eine ModelKlasse
    a) Deine Business Class implementiert IDataErrorInfo und IPropertyChanged

  2. du lädst Daten in die einzelnen Objekte deiner Business Class

  3. Du verwaltest die Objekte in einer DataLayer Class bzw. in einer Liste
    z.B. List<Object> oder BindingList<Object>

  4. Auf deiner Form ziehst du eine BindingSource und einen ErrorProvider

  5. Du fügst eine Datenquelle hinzu und gibst dabei nicht Datenbank sondern Model an
    und fügst der Datenquelle deine Business Klasse (Modelklasse) hinzu.

  6. Im Designer gibst du der BindingSource unter DataSource als Quelle erst einmal deine Modellklasse mit.

  7. Ziehe per Grag & Drop aus der Datenquelle die einzelnen Feldelemente(Properties) auf dein Formular. Damit hast du für alle Feldelemente automatisch diue richtige BindingSource unter DataBindings.

  8. Füge dem Errorprovider als DataSource ebenfalls die BindingSource zu.

  9. Gib in der Initialisierungs oder OnLoad Routine der GUI folgendes an.
    Angenommen du hast eine BindingSource pbindingSource sowie eine
    Listenklasse personalliste. Binde deine BindingSource pbindingsource per Quellcode an deine Listenklasse. -> pBindingSource.DataSource = personalliste;

erst jetzt verwaltet die BindingSource eine Liste deiner Objekte.

  1. laufen lassen - alles funktioniert 😁

Gruss

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“

Timur Zanagar Themenstarter:in
1.457 Beiträge seit 2004
vor 13 Jahren

Hallo wickedcsharper,

Vielen Dank für deinen Beitrag, aber leider muss ich dir sagen das du das Thema komplett verfehlt hast 😉

Es geht mir hier um ein User Control, z.B. Adresse, die ich gerne immer wieder verwenden möchte. Damit das Data Binding und ErrorProvider Control im User Control funktioniert müssen entsprechende Voraussetzungen existieren um dies durchführen zu können.

160 Beiträge seit 2008
vor 13 Jahren

Schuldigung,

hatte angenommen es ginge prinzipiell um den Errorprovider in datengebundenen Oberflächen. hab den Anfang zu flüchtig gelesen. Nehm alles zurück 😉

„Wenn man eine Katze auseinandernehmen will, um zu sehen, wie sie funktioniert, hat man als erstes eine nicht funktionierende Katze in den Händen.“