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.




Mit javascript auf den Inhalt des ausgewählten Listenitem zugreifen

Unbeantwortet Dieser Beitrag hat 34 Antworten

Ohne Rang
131 Beiträge
Thilo1992 erstellt 25 Apr. 2012 10:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hi,

ich möchte einen selbst erstellten Ribbon Button aktivieren, wenn eine bestimmte Spalte des gewählten Items einem bestimmten Wert entspricht. Bisher sieht das bei mir so aus:

EnabledScript="javascript:function singleEnable() {
var items = SP.ListOperation.Selection.getSelectedItems();
var ci = CountDictionary(items);
if (ci == 1)
{
}
}
singleEnable();"

Im if Teil soll die überprüfung dann stattfinden, aber wie greife ich auf den Inhalt des Items zu?

Kenne mich mit javascript schon so kaum aus und hier braucht man dann auch noch spezielle Funktionen von Sharepoint.

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Apr. 2012 10:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das sollte helfen: http://blogs.evocom.de/af/archive/2011/03/22/eigene-ribbon-controls-enabledscript-und-asynchrones-javascript.aspx

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 25 Apr. 2012 11:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, danke hat schonmal geholfen, aber beim abfragen der Liste gibts Probleme.

var ctx = new SP.ClientContext();
var web = ctx.get_web();
var list = web.get_lists().getById(SP.ListOperation.Selection.getSelectedList());

In list steht dann undefined. Wahrscheinlich funktioniert das so nicht bei einer Webpartseite, wie kann man die Liste in der das Item gewählt wurde auf einer Webpartseite herausbekommen?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Apr. 2012 11:31
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das sollte eigentlich so funktionieren. Da Du das aber eh nur mit einer bestimmten Liste machst, kannst Du auch einfach deren Namen angeben. Außerdem solltest Du vielleicht für den Kontext SP.ClientContext.get_current() verwenden (oder beim new ClientContext() die URL mitgeben).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 25 Apr. 2012 11:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, habe es mal abgeändert aber geht immer noch nicht: var ctx = SP.ClientContext.get_current();

Und es gibt auf der Seite mehrere Listen, wenn ich dann den Namen angeben würde, würde es ja zu einem Fehler kommen wenn ein Item aus einer anderen Liste ausgewählt wird.

Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 25 Apr. 2012 11:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

merke grade, das das Problem vlt woanders ist, wie fragt man den Listennamen ab?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Apr. 2012 11:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Thilo Förster"]Und es gibt auf der Seite mehrere Listen, wenn ich dann den Namen angeben würde, würde es ja zu einem Fehler kommen wenn ein Item aus einer anderen Liste ausgewählt wird[/quote]

Vielleicht ist das auch das grundsätzliche Problem. In diesem Fall ist SP.ListOperation.Selection.getSelectedList() vielleicht gar nicht belegt. Ich habe es immer nur mit "normalen" Listenansichten verwendet und ein Workaround fällt mir da auf die Schnelle nicht ein.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 25 Apr. 2012 14:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

hm, wenn list keine liste enthält dürfte das: ListItem = list.getItemById(items[0].id); doch nicht funktionieren oder?

Bei der Zeile kommt nämlich keine Fehlermeldung, die Fehlermeldung kommt hier: ListItem.get_item('Aktionsstatus') Aktionsstatus wird nicht gefunden und da die Spalte aber vorhanden ist und selbst intern so heißt dachte ich der Fehler ist, dass in list nichts drinsteht.

Wie kann ich den Namen der Liste abfragen? So kann ich sehn ob was drin ist.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Apr. 2012 14:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hast Du das ListItem auch zuvor geladen - ctx.Load gefolgt von ctx.executeQueryAsync?

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 25 Apr. 2012 14:57
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Oh, nein, dachte das wäre irgendwas anderes hätte wohl besser erst alles komplett durchgelesen jetzt gehts. Bloß kommts noch nicht in die if Anweisung rein, vlt hab ich da was falsch eingegeben. Und wie bekommt man jetzt den Namen der Liste? Will vorher noch überprüfen obs auch die richtige Liste ist.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 25 Apr. 2012 15:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Über list.get_title()

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 26 Apr. 2012 08:37
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

RefreshCommandUI(); startet nicht die Funktion von vorne sondern alles was im javascript Teil steht und dadurch wird ja eine Endlosschleife erzeugt, da myListItem am Anfang immer wieder auf null gesetzt wird.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Apr. 2012 08:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Dann lies Dir meinen Blogpost nochmal genau durch. Das funktioniert definitiv - ich habe es in mehreren Projekten prudktiv im Einsatz.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 26 Apr. 2012 09:20
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, muss wahrscheinlich doch das Script in eine .js Datei machen, wollte das eigentlich nicht. Bekomme es aber nicht hin das einzubinden, da ja Location dazu ScriptLink sein muss aber um den Button ins Ribbon einzubinden muss es ja CommandUI.Ribbon sein und 2 Locations geht nicht.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Apr. 2012 10:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du kannst das alles in eine elements.xml packen. Man ist dabei nicht auf ein Element beschränkt, d.h. Du kannst dort sowohl die Ribbonerweiterung als auch den ScriptLink unterbringen. Und wenn es sein muß auch noch ein paar Inhaltstypen und eine Listendefinition ;-)

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 26 Apr. 2012 11:28
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie? Ich könnte 2 CustomActions machen, der Button muss dann in dem Mit Location=CommandUI.Ribbon sein und der Command vom Button dann aber in dem mit location=LinkScript geht das?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Apr. 2012 12:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ja, genau das geht problemlos.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 26 Apr. 2012 13:11
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, habs so gemacht. Kommt keine Fehlermeldung und Button bleibt deaktiviert, die Funktion wird jetzt gar nicht ausgeführt. Wahrscheinlich findet der Button das Command doch nicht.

Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 26 Apr. 2012 13:19
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hatte mich vertippt, deshalb ist nichts passiert, jetzt kommt die fehlermeldung, dass ich bei Location=ScriptLink kein CommandUIExtension benutzen darf und dann kann ich auch kein CommandUIHandler machen, wie soll ich es dann machen?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Apr. 2012 14:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Du bringst da irgendwas durcheinander...

In der Datei hast Du ein Root-Element:
<elements></elements>

Darin packst Du die CustomAction für das Ribbon:
<CustomAction Location="CommandUI.Ribbon" ... mit all ihren <CommandUIExtensions>

Auf gleicher Ebene packst Du dort den ScriptLink rein:
<CustomAction Location="ScriptLink" Id="DeineID" ScriptSrc="script.js" />

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 26 Apr. 2012 14:42
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, danke jetzt hat das einbinden geklappt und das ltem wird nicht jedesmal auf null gesetzt. Aber jetzt kommt eine fehlermeldung, dass das Feld ID unbekannt ist, und get_id geht auch nicht, da wird eine Funktion als text zurückgegeben und wenn ich die überprüfung nach der id weglasse wird immer true zurückgegeben.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 26 Apr. 2012 14:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Da solltest Du einen JavaScript-Debugger bemühen, sonst kommst Du nicht weiter. Im IE z.B. die Entwicklertools im Menü Extras.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 26 Apr. 2012 15:06
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich debugge es ja mit vs2010, aber das bringt mich nicht weiter, id müsste es doch eigentlich geben und wenn ich die Überprüfung weglasse ist es noch verwirrender, da es true zurückgibt obwohl der Variable nie true zugewiesen wird sondern nur false.

Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 27 Apr. 2012 08:43
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hab mir das noch auf ein paar anderen Seiten angeschaut und verschiedene änderungen gemacht, ist jetzt aber immer das selbe Problem, es wir zufällig true oder false zurückgegeben und es wird sogar als true zurückgegeben obwohl wie oben gesagt, die Variable manchmal nie auf true gesetzt wird.

Gibt es denn keine andere Möglichkeit?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 27 Apr. 2012 09:58
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Nein, es gibt keine andere Möglichkeit. Irgendwo hast Du einen Fehler, aber keiner hier kann den aus der Ferne finden. Wir wissen ja noch nichtmal an welcher Stelle bei Dir true oder false geliefert wird...

Wie gesagt: ich habe genau das in einigen Projekten produktiv im Einsatz und es läuft problemlos.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 27 Apr. 2012 10:45
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ist es wichtig, das man über this.myListItem auf die variable zugreift? Ich habe nämlich überall das this vornedran entfernt, da es damit überhaupt nicht ging sondern nur ohne.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 27 Apr. 2012 10:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

this verhält sich in JavaScript nicht so wie z.B. bei C#. Es bezieht sich nicht immer auf die aktuelle Datei oder die aktuelle Klasse, sondern auf den Kontext, aus dem eine Funktion aufgerufen wird. Bei den Callback-Methoden (die über executeQueryAsync aufgerufen werden) ist dieser Kontext ein anderer.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 30 Apr. 2012 08:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

So ich habe jetzt mal deinen Quellcode komplett so übernommen und nur die Sachen abgeändert, die ich abändern muss.

Das sieht jetzt so aus:

var myListItem = null;
var myButtonEnabled = false;

function myEnabledFunction() {
    var selectedItems = SP.ListOperation.Selection.getSelectedItems();
    if (CountDictionary(selectedItems) != 1) {
        return false;
    }
    var itemId = selectedItems[0]["id"];
    if (this.myListItem != null && this.myListItem.get_item("ID") == itemId) {
        return this.myButtonEnabled;
    }
    else {
        var ctx = SP.ClientContext.get_current();
        var web = ctx.get_web();
        var list = web.get_lists().getById(SP.ListOperation.Selection.getSelectedList());
        this.myListItem = list.getItemById(itemId);
        ctx.load(this.myListItem, "ID", "Aktionsstatus");
        ctx.executeQueryAsync(enabledQuerySuccess, enabledQueryFailed);
    }
}

function enabledQueryFailed(s, args) {
    this.myButtonEnabled = false;
    this.myListItem = null;
}

function enabledQuerySuccess() {
    var status = this.myListItem.get_item("Aktionsstatus");
    if (status == "5- Aktiv") {
        this.myButtonEnabled = true;
    }
    else {
        this.myButtonEnabled = false;
    }
    RefreshCommandUI();
}

Aber da kommt dann die Meldung, dass es ID nicht gibt und wenn ich es durch this.myListItem.get_id() ersetze kommt der gleiche Fehler.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 2 Mai 2012 13:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Oh Mann, ich muß mich entschuldigen. Bei den beiden Callback-Methoden enabledQueryFailed und enabledQuerySuccess muß man alle "this" weglassen. Ich hatte das ja in meinem letzten Post hier geschrieben, aber in meinem Blog war das noch falsch (ist jetzt aber geändert).

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 2 Mai 2012 13:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, habe die this dort entfernt. Jetzt wird das Feld ID aber immer noch nicht gefunden.

Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 3 Mai 2012 10:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Woran könnte es liegen das die Id nicht gefunden wird?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Mai 2012 11:50
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Kann ich Dir auch nicht sagen. Bemühe einen Debugger und schaue Dir das genauer an.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 3 Mai 2012 12:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Habe das Problem gelöst, jetzt funktioniert alles, anscheinend kann man das: myListItem.get_item("ID") nur innerhalb von der Funktion enabledQuerySuccess() machen. Ich habe jetzt einfach noch eine globale Variable ID angelegt, der dann in der Funktion die ID zugewiesen wird.

Hat das bei dir so funktioniert?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Mai 2012 12:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Bei mir hat es so funktioniert. Hauptsache Du hast eine für Dich funktionierende Lösung gefunden.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
131 Beiträge
Thilo1992 Als Antwort am 3 Mai 2012 13:59
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ok, werde das Projekt dann mal fertig machen.

Vielen Dank für die Hilfe!