Aus der Praxis – Bibliotheken in InfoPath –oder- wo ist mein Filename?
avatar

Wer schon einmal einem InfoPath Formular eine SharePoint Bibliothek als Datenquelle zugewiesen hat, wird es bemerkt haben: Der Dateiname steht als Feld nicht zur Verfügung.

Natürlich kann der Titel ausgewählt werden, aber das ist nicht das selbe, denn dieser kann vom Benutzer unabhängig vom Dateinamen bearbeitet werden. Und selbst unverändert enthält er nur den Dateinamen ohne Erweiterung.

image

Was nun, wenn man aber den Dateinamen braucht? In einem Projekt benötigte ich Dateinamen und –url für die Datei, die der Benutzer in einer Drop-Down-Box ausgewählt hat. Diese Box hatte als Datenquelle die Bibliothek.

Folgender Code im Changed-Event der Drop-Down-Box hat mir weitergeholfen:

public void FileID_Changed(object sender, XmlEventArgs e)
{
    // get webservice
    ListsWebService.Lists lists = GetSharePointWebService<ListsWebService.Lists>("lists.asmx");     // prepare query xml
    XmlDocument doc = new XmlDocument();
    doc.LoadXml("<Document><Query /><ViewFields /><QueryOptions /></Document>");
    XmlNode queryNode = doc.SelectSingleNode("//Query");
    XmlNode viewFieldsNode = doc.SelectSingleNode("//ViewFields");
    XmlNode queryOptionsNode = doc.SelectSingleNode("//QueryOptions");
    // get only the item with the chosen id
    queryNode.InnerXml = "<Where><Eq><FieldRef Name='ID' /><Value Type='Counter'>" + e.NewValue + "</Value></Eq></Where>";
    // execute query, prepare result
    XmlNode result = lists.GetListItems("Releases", null, queryNode, viewFieldsNode, null, queryOptionsNode, null);
    XmlDocument resultDoc = new XmlDocument();
    resultDoc.LoadXml(result.InnerXml);
    XmlNamespaceManager nsManager = new XmlNamespaceManager(resultDoc.NameTable);
    nsManager.AddNamespace("z", "#RowsetSchema");
    nsManager.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
    // get file url and name
    string url = null;
    string name = null;
    foreach (XmlElement row in resultDoc.SelectNodes("/rs:data/z:row", nsManager))
    {
        if (row.Attributes["ows_EncodedAbsUrl"] != null)
        {
            url = row.Attributes["ows_EncodedAbsUrl"].Value;
        }
        if (row.Attributes["ows_EncodedAbsUrl"] != null)
        {
            name = row.Attributes["ows_FileLeafRef"].Value;
        }
    }
    // set the FileUrl and FileName fields
    if (url != null)
    {
        XPathNavigator target = e.Site.SelectSingleNode("../my:FileUrl", this.NamespaceManager);
        target.SetValue(url);
        XPathNavigator target = e.Site.SelectSingleNode("../my:FileName", this.NamespaceManager);
        target.SetValue(url);
    }
}

Diese Lösung ist natürlich nur möglich, wenn ein InfoPath Formular mit Code verwendet wird.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


× 6 = dreißig sechs

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>