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.




SPGirdView - Felder enthalten id;#

Unbeantwortet Dieser Beitrag hat 3 Antworten

Ohne Rang
54 Beiträge
DDG erstellt 8 Juli 2015 11:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich hab eine SharePoint 2013 Umgebung und ein Visual Webpart. Bei dem Webpart zeige ich bestimmte Elemente aus einer Liste an. Die View wird über eine SPGridView erstellt. Das gefilterte Anzeigen klappt wunderbar. Mein Problem ist, dass sich unter den anzuzeigenden Feldern "Lookup" und "UserMulti" Spalten befinden und die Werte nicht wie gewohnt dargestellt werden sondern mit id;# als Trennung.

Normale Darstellung:

Darstellung über GridView:

 Kann mir jmd sagen wie ich die Werte in der üblichen Form darstellen kann? Wie ich zum Beispiel auf die Werte der Spalten zugreifen kann und den String bearbeiten kann. Was nicht gerade eine schöne Lösung wäre.

Vielen Dank und viele Grüße

Dennis

 

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Juli 2015 11:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Es gibt mehrere Möglichkeiten. Welche für Dich die beste ist, weiß ich nicht.

Für viele Spaltentypen in SharePoint gibt es spezielle Datenklassen, die Dir auch die Werte in passender Form liefern können. Hier z.B. SPFieldLookupValue und SPFieldUserValue bzw. deren Collection-Verianten für Felder mit Mehrfachauswahl.

Du kannst aber auch unabhängig vom Spaltentyp einfach das SPField-Objekt der Spalte nehmen und dessen GetFieldValueAsText bzw. GetFieldValueAsHtml Methoden.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
54 Beiträge
DDG Als Antwort am 8 Juli 2015 12:48
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für deine schnelle Antwort. Diese Möglichkeiten sind mir bekannt aber ich weiß nicht wie ich sie in diesem Kontext anwenden kann. Vielleicht hätte ich das Problem gleich besser beschreiben sollen. Hier ist meine Vorgehensweise. Ich hole mit dir Items der originalen Liste und Filtere sie nach einer ListItemID (die Werte kommen aus einer XML). Diese gefilterten Items hole ich als DataTable und füge sie dann der GridView als DataSource hinzu. Ich hab mal meinen Versuch eine Änderung vorzunehmen im Code gelassen. Er hat leider nicht funktioniert. Das Array hat zwar die Werte kann sie aber anscheinend nicht ändern. Die Regex Funktion stimmt auch nicht, falls die jmd überprüft. Mein Problem liegt darin, dass ich nicht weiß wann und wie ich den DataTable ändern kann. Die Werte über eine SPFIeldUserValueCollection hinzu zu fügen oder zu splitten und im richtigen Format hinzu zu fügen, wäre ja kein Problem.

    SPList list = Utils.getSPList(element, Context.User.Identity.Name);
    SPGridView grid = new SPGridView();
    grid.AutoGenerateColumns = false;
    grid.AllowSorting = true;


    foreach (var field in element.Element("fields").Descendants("field"))
    {
        grid.Columns.Add(new SPBoundField() { DataField = field.Value, ShowHeader = true,
  HeaderText = list.Fields.GetFieldByInternalName(field.Value).Title });
    }

    SPListItemCollection items = list.Items;
    SPBoundField f = null;
    try
    {
  EnumerableRowCollection<DataRow> w;

  if (element.Element("listItemId") != null
  {
   int p = Int32.Parse(element.Element("listItemId").Value);
   w = items.GetDataTable().AsEnumerable()
    .Where(row => row.Field<int>(FieldInternalNames.Id) == p);
  }
  if (w.ToList().Count > 0)
  {
   DataTable tblFiltered = w.CopyToDataTable();
   //mein Versuch die Daten zu ändern
   DataRowCollection drc = tblFiltered.Rows;
   foreach (DataRow dr in drc)
   {
    for (int i = 0; i < dr.ItemArray.Count(); i++)
    {
     try
     {
      String value = (String)dr.ItemArray[i];
      string newString = Regex.Replace(value, @"#[\d-];", string.Empty);
      newString = Regex.Replace(newString, "#", " ");
      dr.ItemArray[i] = newString;
     }
     catch (Exception)
     {
     }     
    }                          
    }
   grid.DataSource = tblFiltered;
  }
    }
    catch (Exception)
    {
        grid.Columns.Remove(f);
        grid.DataSource = items.GetDataTable();
    }

    grid.DataBind();
    return grid;

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 8 Juli 2015 13:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

OK, Problem verstanden. Das geht dann in die Richtung:
http://www.developer.com/net/asp/article.php/3609991/Dynamic-Template-Columns-in-the-ASPNET-20-GridView-Control.htm
https://msdn.microsoft.com/en-us/library/bb288032.aspx

Viele Grüße
Andi
af @ evocom de
Blog