SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Gültigkeitsprüfung, (Spalten-)Validierung mit zwei Textfeldern, die voneinander abhängen

Geprüfte Antwort Dieser Beitrag hat 8 Antworten

Ohne Rang
242 Beiträge
Peter Oswald erstellt 14 Dez. 2012 11:02
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo,

Input: eine Liste mit zwei Textfeldern

Ziel: mindestens ein Textfeld muss befüllt sein.

Target: Sharepoint Foundation 2010

Lösung? In der Gültigkeitsprüfung kann ich die Textfelder gar nicht auswählen und eine Spaltenvalidierung haben sie wohl auch nicht. Hinzu kommt noch, dass das eine Textfeld ein Nachschlagefeld aus einer anderen Liste ist. Mit der Eigenschaft "Diese Spalte muss Informationen enthalten" komme ich ja auch nicht weiter. Im Workflow sehe ich auch keine Lösung. Wie dann?

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 14 Dez. 2012 11:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Über die Gültigkeitsprüfung bei der Liste (nicht bei den jeweiligen Spalten) kann man das mit Textfeldern machen.

[quote user="Celophysis"]das eine Textfeld ein Nachschlagefeld aus einer anderen Liste [/quote]

Dann ist es eben auch kein Textfeld und mit Nachschlagefeldern geht es nicht.

Per Workflow könnte man das machen (Wenn Feld1 ist leer ODER Feld2 ist leer), aber dann ist das Element bereits angelegt und man könnte höchstens noch den Ersteller per Mail benachrichtigen, daß das so nicht geht. Oder das Element einfach wieder löschen, aber das ist auch nicht wirklich benutzerfreundlich.

Am Schönsten löst man sowas mit einem zu programmierenden EventReceiver.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
242 Beiträge
Peter Oswald Als Antwort am 18 Dez. 2012 12:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok, das mit dem EventReceiver leuchtet ein, und ich habe dass jetzt mal angesetzt: sprich in meine Lösung einen EventReceiver für ItemAdding hinzugefügt, aber wenn ich mir dann die properties (SPItemEventProperties) anschaue, ist alles leer oder null. Wie komme ich denn jetzt vom ItemAdding zu meinem ListItem, der in der NewForm eingetragen wurde?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Dez. 2012 12:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

In ItemAdding gibt es noch kein ListItem. Es wird erst danach angelegt und das ist ja auch der Grund dafür, daß man es abbrechen kann ;-)

Du kannst aber die Feldinhalte über die AfterProperties prüfen und dann ggf. die Neuanlage abbrechen:

if (properties.AfterProperties["Feld1"] == null) {
  properties.ErrorMessage = "Feld1 darf nicht leer sein";
  properties.Status = SPEventReceiverStatus.CancelWithError;
}

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
242 Beiträge
Peter Oswald Als Antwort am 18 Dez. 2012 13:33
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Yapp, Du hast - wie so häufig :-) - Recht, Andi. Mein Fehler war, dass ich mir die properties bzgl. "Changed Values" angeschaut hatte. Und da steht natürlich nix drin.

Der folgende Code führt dann in Richtung "Auswertung":

       public override void ItemAdding(SPItemEventProperties properties)
       {
           string Name = String.Empty;
           string content = String.Empty;
           using (SPWeb web = properties.OpenWeb())
           {
               Name = web.Lists[properties.ListId].Fields["Titel"].InternalName;
               if (Name != null)
               {
                   content = properties.AfterProperties[Name].ToString();
                    if (content != null)
                    {
                            //mache irgendwas...

                           if(<not ok>) properties.Cancel = true;

                           else base.ItemAdding(properties);
                    }
               }
           }
        }

Vielen Dank!

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Dez. 2012 14:29
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Web und Liste mußt Du nicht extra erstellen, die gibt es bereits in den properties. Und das Titel-Feld hat definitiv immer den festen InternalName "Title", den kannst Du also ruhigen Gewissens hart codieren.

[quote user="Celophysis"]content = properties.AfterProperties[Name].ToString();
    if (content != null)[/quote]

Achtung: damit bekommst Du einen Fehler, wenn das Feld leer ist. Es enthält dann null und Du versuchst darauf ein ToString(). Ich mache das immer so:

string content = properties.AfterProperties["Feld"] as string;
if (!string.IsNullOrEmpty(content)) {

}

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Dez. 2012 14:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ach und noch was: properties.Cancel ist deprecated. Microsoft sagt, man solle stattdessen properties.Status setzen, wie ich es oben gezeigt habe.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
242 Beiträge
Peter Oswald Als Antwort am 18 Dez. 2012 14:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

ok, habe ich übernommen, aber eine Sache bekomme ich nicht hin:

wie komme ich wieder zurück auf das Eingabeformular, wo der Fehler entstand?

Ich dachte jetzt eigentlich, dass ein CancelWithError auch auf der Seite verbleiben würde, wo der User die Eingaben gemacht hat. Ich will ja jetzt kein aktives Redirect machen... :-/

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 18 Dez. 2012 15:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist ein Problem bei der Geschichte. Die einzige Möglichkeit ist, daß der Benutzer im Browser auf "Zurück" klickt (Du kannst ja in der Fehlermeldung darauf hinweisen). Die Eingaben bleiben dann aber erhalten und können korrigiert werden.

Viele Grüße
Andi
af @ evocom de
Blog