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.




Cross Farm ViewWebpart

Unbeantwortet Dieser Beitrag hat 10 Antworten

Ohne Rang
18 Beiträge
Entwickler1979 erstellt 17 Mai 2013 12:43
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo, wiedermal komme ich bei meinen Projekt nicht weiter.

Auf einen SharePoint 2010 soll ein Webpart abfragen was in einer anderen Liste (außerhalb) vorhanden ist. Funktioniert auch super , Nur möchte ich das ganzen in einer  SharePoint Liste abbilden(visuell).

private GridView _datagrid;

 

protected override void Render(HtmlTextWriter writer)

{

 

List list = ctx.Web.Lists.GetByTitle(LISTNAME);

ctx.Load(list);

 

CamlQuery query = new CamlQuery();

query.ViewXml = "<View><View/>";

 

Microsoft.SharePoint.Client.ListItemCollection listitem = list.GetItems(query);

ctx.Load(listitem);

 

 

 

ctx.ExecuteQuery();

_datagrid.DataSource = listitem;

_datagrid.DataBind();

base.Render(writer);

}

Jetzt zeigt er mir nur Standard ein GridVIew., ich hatte kurzeitig eine ListView (sogar mit Folder). Nun zu meiner Frage ist da  ein Fehler von meinen SharePoint aus oder habe ich mist gebaut. Würde mich auf jede Hilfe freuen.

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 17 Mai 2013 15:13
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Entwickler1979"]query.ViewXml = "<View><View/>";[/quote]

Damit hast Du eine komplett leere Ansicht ohne ViewFields (und ohne Sortierung, Filter, usw.).

Warum baust Du es nicht so um, daß Dein Code auf eine Ansicht der Liste zugreift (List.Views) oder vielleicht sogar einfach die Standardansicht anzeiegt (List.DefaultView). Entweder Du verwendest dann das ViewXml dieser Ansicht für Deine eigene Query oder Du verwendest gleich View.RenderAsHtml().

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
18 Beiträge
Entwickler1979 Als Antwort am 21 Mai 2013 13:46
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

@andi

Also ich habe das jetzt auf ein paar wege getestet .Keinerlei Veränderung. Immer wieder bekomme ich nur das Standard Grid zu sehen.Ich glaube das mit dem Listview verstehe ich nicht so ganz. Könntest du mir kurz vl. ein Snippet ansetzen ,damit ich vielleicht dann es versteh. Lg Andi

der aktuelle Source Code

using System;

using System.ComponentModel;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using Microsoft.SharePoint;

using Microsoft.SharePoint.WebControls;

using System.Net;

using Microsoft.SharePoint.Client;

using System.Data;

namespace CrossFarmViewerWebpartExt.VisualWebPart1

{

private GridView _datagrid;

 

 

protected override void CreateChildControls()

{

base.CreateChildControls();

 

this._datagrid = new GridView();

 

 

Controls.Add(this._datagrid);

}

 

#region (OnlyRender)

protected override void Render(HtmlTextWriter writer)

{

try

{

ClientContext ctx = new ClientContext(FarmUrl);

ctx.Credentials = cred;

List list = ctx.Web.Lists.GetByTitle(LISTNAME);

ctx.Load(list);

 

//CamlQuery query = new CamlQuery();

//query.ViewXml = "<View/>";

CamlQuery query = CamlQuery.CreateAllItemsQuery();

 

 

Microsoft.SharePoint.Client.ListItemCollection listitem = list.GetItems(query);

ctx.Load(listitem);

ListCollection lc = ctx.Web.Lists;

ctx.Load(lc);

 

 

 

ctx.ExecuteQuery();

 

DataTable dt = new DataTable();

dt.Columns.Add("Title");

for (int i = 0; i < listitem.Count; i++)

{

dt.Rows.Add(dt.NewRow());

dt.Rows[dt.Rows.Count - 1]["Title"] = listitem[i]["Title"].ToString();

}

if(dt.Rows.Count >0)

{

_datagrid.DataSource = dt;

_datagrid.DataBind();

 

 

}

else

{

}

 

 

 

 

/*

DataView dvTasksList = new DataView(dt);

this._datagrid.AutoGenerateColumns = false;

 

_datagrid.DataSource = lc;

_datagrid.DataBind();

}

catch {

 

}

base.Render(writer);

}

#endregion

 

 

}

}

Ohne Rang
18 Beiträge
Entwickler1979 Als Antwort am 23 Mai 2013 10:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das Datagrid View habe ich jetzt so angepasst das es sehr nahe kommt an die sp Listen. Eine letzte Frage würde ich gerne noch stellen. Ich bekomme Alle Listitems ins Datagrid mit Folder.

Gibt es eine Möglichkeit das man durch die Ordner klicken kann wie in einer normalen Liste und nicht alle Items aufgestellt bekomme.

 

lg Andi

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Mai 2013 10:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Entwickler1979"]Das Datagrid View habe ich jetzt so angepasst das es sehr nahe kommt an die sp Listen[/quote]

Wenn Du ein SPGridView statt dem normalen GridView benutzt, dann sieht es komplett nach SharePoint aus.

[quote user="Entwickler1979"]Gibt es eine Möglichkeit das man durch die Ordner klicken kann wie in einer normalen Liste [/quote]

Wie oben bereits geschrieben: das hängt alles von der verwendeten Query ab. Verwende doch einfach die Query einer vorhandenen Ansicht. Oder schaue Dir diese Query bei einer Ansicht an (kann man mit SharePoint Designer machen) und übernehem die für Dich wichtigen Teile.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
18 Beiträge
Entwickler1979 Als Antwort am 23 Mai 2013 16:40
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Super danke, hat mir auf Jedenfall weitergeholfen. Jetzt habe ich nur versucht meine Liste zu füllen, aber leider bis jetzt kein Erfolg ;( Wenn ich die Methode FillDataTable auf Static setzte , bekomme ich Probleme mit dem Listitems. Momentan stehe ich wieder voll an.

lg andi

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using System.Net;
using Microsoft.SharePoint.Client;
using System.Data;
using System.Xml.Xsl;
using System.Drawing;
using System.Reflection;


namespace CrossFarmViewerWebpartExt.VisualWebPart1
{
    [ToolboxItemAttribute(false)]
    public class VisualWebPart1 : WebPart
    {
        // Visual Studio might automatically update this path when you change the Visual Web Part project item.
        //private const string _ascxPath = @"~/_CONTROLTEMPLATES/CrossFarmViewerWebpartExt/VisualWebPart1/VisualWebPart1UserControl.ascx";

        private SPGridView _datagrid;
        private ObjectDataSource _datasource;
       
       
        protected override void CreateChildControls()
        {
            base.CreateChildControls();
            try
            {
                _datagrid = new SPGridView();
                _datagrid.ID = "MyGridView";
                _datagrid.AutoGenerateColumns = false;
                _datagrid.AlternatingRowStyle.BackColor = Color.WhiteSmoke;
                _datagrid.RowDataBound += new GridViewRowEventHandler(_datagrid_RowDataBound);

                _datagrid.AllowSorting = true;

                _datagrid.PageSize = 3;
                _datagrid.AllowPaging = true;
                _datagrid.PagerStyle.HorizontalAlign = HorizontalAlign.Center;

                BoundField bf = new BoundField();
                bf.DataField = "Title";
                bf.HeaderText = "Title";
                bf.SortExpression = "Title";
                bf.Visible = true;
                _datagrid.Columns.Add(bf);
               

                _datasource = new ObjectDataSource();
                string strTypename = "CrossFarmViewerWebpartExt.VisualWebPart1,";
                strTypename += Assembly.GetExecutingAssembly().FullName;
                //_datasource.TypeName = strTypename;
                _datasource.SelectMethod = "FillDataTable";
                _datasource.ID = "myDataSource";
               _datasource.TypeName = this.GetType().AssemblyQualifiedName;
            

                HttpRequest req = HttpContext.Current.Request;
                if ((req.Form["__CALBACKID"] == null) ||
                    (req.Form["__CALBACKPARAM"] == null) ||
                    (!req.Form["__CALLBACKID"].EndsWith("myGridView")))
                {

                }

                Controls.Add(_datasource);
                _datagrid.DataSourceID = _datasource.ID;
                Controls.Add(_datagrid);
                _datagrid.PagerTemplate = null;

                SPGridViewPager pager = new SPGridViewPager();
                pager.GridViewId = _datagrid.ID;
                Controls.Add(pager);

              
      
                _datagrid.DataBind();


            }
            catch (Exception ex)
            {
                LiteralControl lit = new LiteralControl();
                lit.Text = "Error: " + ex.ToString();
                Controls.Add(lit);
            }
         
        }

        void _datagrid_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if((null != sender) && (e.Row.RowType == DataControlRowType.Header))
            {
                string _filCol = ((SPGridView)sender).FilterFieldName;
                SetGridFilterIcon(_datagrid,_filCol,e.Row);
            }
        }

        private void SetGridFilterIcon(SPGridView _datagrid, string _filCol, GridViewRow gridViewRow)
        {
          
        }

        void _datasource_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
        {
            e.ObjectInstance = this;
        }

        public string FarmUrl;
        [Category("Settings"),
        WebBrowsable(true),
        Personalizable(PersonalizationScope.Shared),
        WebDisplayName("Url der Farm/Site/.."),
        WebDescription("")]
        public string _farmUrl
        {
            get { return FarmUrl; }
            set { FarmUrl = value; }
        }

        public string LISTNAME;
        [Category("Settings"),
        WebBrowsable(true),
        Personalizable(PersonalizationScope.Shared),
        WebDisplayName("Name der Liste/Lib"),
        WebDescription("")]
        public string _listName
        {
            get { return LISTNAME; }
            set { LISTNAME = value; }
        }

        public string ROWLIMIT;
        [Category("Settings"),
        WebBrowsable(true),
        Personalizable(PersonalizationScope.Shared),
        WebDisplayName("Row Limit"),
        WebDescription(""),
        DefaultValue("5")]
        public string _rowlimint
        {
            get { return ROWLIMIT; }
            set { ROWLIMIT = value; }
        }
       
        protected override void Render(HtmlTextWriter writer)
        {
            try
            {
                NetworkCredential cred = new NetworkCredential("User", "Password");
                ClientContext ctx = new ClientContext(FarmUrl);
                ctx.AuthenticationMode = ClientAuthenticationMode.Default;
                ctx.Credentials = cred;


                List list = ctx.Web.Lists.GetByTitle(LISTNAME);
                ctx.Load(list);
                ctx.Load(list.RootFolder);
                ctx.Load(list.RootFolder.Folders);
                ctx.Load(list.RootFolder.Files);
                ctx.Load(list);


                CamlQuery query = new CamlQuery() ;
                query.ViewXml = "<View Scope=\"RecursiveAll\"><RowLimit>"+ ROWLIMIT + "</RowLimit></View>";


                listitem = list.GetItems(query);
                ctx.Load(listitem);

                ctx.ExecuteQuery();
            }
            catch (Exception ex)
            {
                LiteralControl lit = new LiteralControl();
                lit.Text = ex.ToString();
                Controls.Add(lit);
            }
            base.Render(writer);
        }

        private static Microsoft.SharePoint.Client.ListItemCollection listitem;
        public static DataTable FillDataTable()
        {
            DataTable dt = new DataTable();
            //DataRow row = null;
         
            dt.Columns.Add("Title",typeof(string));

            for (int i = 0; i < listitem.Count; i++)
            {
                dt.Rows.Add(dt.NewRow());
                dt.Rows[dt.Rows.Count - 1]["Title"] = listitem[i]["Title"].ToString();
            }
             /*
            DataRow row = null;
            dt.Columns.Add("Title", typeof(string));
            dt.Columns.Add("Modifyby", typeof(string));
            dt.Columns.Add("Text", typeof(string));

            row = dt.NewRow();
            row["Title"] = "Demo";
            row["Modifyby"] = "Test";
            row["Text"] = "Demo";
            dt.Rows.Add(row);

            row = dt.NewRow();
            row["Title"] = "Demo";
            row["Modifyby"] = "Test";
            row["Text"] = "Demo";
            dt.Rows.Add(row);
            */

            return dt;
        }

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 23 Mai 2013 17:06
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Tut mir leid, aber ich steig da nicht durch :-(

Du hast da viel zu viel, um das ordentlich testen zu können. Vor allem viel zu viele Objekte, die als DataSource in Frage kämen...

Fange doch nochmal ganz vorne und ganz einfach an:
Erzeuge in CreateChildControls das SPGridView mit einem BoundField für den Title. Lasse alles mit Sorting und Paging weg, damit es einfacher wird.
In OnPreRender holst Du Dir die gewünschten ListItems und füllst damit eine DataTable. Die DataTable gibst Du an SPGridView.DataSource und rufst DataBind auf.

Damit hast Du es auf das Wesentliche reduziert und kannst viel besser Probleme identifizieren. Erst wenn das dann funktioniert, kümmerst Du Dich um die Details, wie mehr Spalten, Paging, usw.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
18 Beiträge
Entwickler1979 Als Antwort am 24 Mai 2013 14:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Super, die Daten konnte ich laden. Jetzt fehlt mir nur der Punkt mit dem Subfolder und Items.

Kann ich das mit der objectdatasource automatisch filtern oder muss ich das selber ausprogrammieren. Sprich Download von Dateien bzw aufrufen von Folder.

 

lg Andi

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Mai 2013 14:10
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Was wolltest Du nochmal mit den Foldern? Wie auch immer: man kann das alles grundsätzlich über die CAML-Abfrage steuern. Schaue Dir einfach das CAML einer Ansicht an, die so funktioniert, wie Du es möchtest.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
18 Beiträge
Entwickler1979 Als Antwort am 24 Mai 2013 14:32
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wenn ein User auf einen Folder klickt ,das die unteren Elemente angezeigt werden. So wie einen normale Dokumenten Libary beim SP.

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 24 Mai 2013 15:17
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist allerdings nicht ganz trivial. Die prinzipielle Vorgehensweise ist so: Du mußt für die Folder (kann man am Inhaltstyp erkennen) einen eigenen Link erzeugen (kann man mit einem CustomFieldTemplate für das GridView machen). Wenn jemand auf den Link klickt, startest Du eine neue Abfrage und gibst dem SPQuery dabei den angeklickten RootFolder mit (dadurch bekommst Du nur die Elemente aus diesem Folder).

Viele Grüße
Andi
af @ evocom de
Blog