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.




SPGridview

Unbeantwortet Dieser Beitrag hat 11 Antworten

Ohne Rang
1714 Beiträge
C.Kaiser erstellt 27 Aug. 2010 17:39
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo zusammen,

ich verusche gerade auf einer Custom Application Page ein SPGridView anzeigen zu lassen. Folgenden Code verwende ich (auch hier nachzulesen: http://nishantrana.wordpress.com/2009/03/23/using-%20spgridview-to-bound-to-list-data-in-sharepoint/)

protected SPGridView grid;

protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            mySite = SPContext.Current.Site;
            myWeb = SPContext.Current.Web;
            myList = myWeb.Lists["Liste"];
            grid = new SPGridView();

            if (!Page.IsPostBack)
            {
                BindToGrid(myList, grid);
            }
        }

        private void BindToGrid(SPList myList, SPGridView gridView)
        {
            //grdView.Columns.Clear();
            // get all the listitem
            SPListItemCollection results = myList.Items;

            // create the datatable object
            DataTable table;
            table = new DataTable();
            table.Columns.Add("Type", typeof(string));
            table.Columns.Add("Name", typeof(string));
            table.Columns.Add("Created", typeof(string));    

            // Create rows for each splistitem
            DataRow row;       

            foreach (SPListItem result in results)
            {
                row = table.Rows.Add();
                row["Type"] = result["Produkt"].ToString();
                row["Name"] = result["Produkt"].ToString();
                row["Created"] = result["Created"].ToString();   
            }
            // create the bound fields

            SPBoundField boundField;

            boundField = new SPBoundField();
            boundField.HeaderText = "Type";
            boundField.DataField = "Type";
            boundField.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
            boundField.ItemStyle.Wrap = false;

            gridView.Columns.Add(boundField);

            boundField = new SPBoundField();
            boundField.HeaderText = "Name";
            boundField.DataField = "Name";
            gridView.Columns.Add(boundField);

            boundField = new SPBoundField();
            boundField.HeaderText = "Created";
            boundField.DataField = "Created";
            gridView.Columns.Add(boundField);   

            gridView.AutoGenerateColumns = false;
            gridView.DataSource = table.DefaultView;
            gridView.DataBind();   
   }

In der Custom Application Page habe ich folgendes eingefügt (neben den anderen Placeholdern):
<asp:Content ID="Main" contentplaceholderid="PlaceHolderMain" runat="server">
   
    <SharePoint:SPGridView runat="server" ID="grid" AutoGenerateColumns="false" RowStyle-BackColor="#DDDDDD" AlternatingRowStyle-BackColor="#EEEEEE"/>
</asp:Content>

Die Seite öffnet sich normal (Titel usw. werden angezeigt), nur wird dort wo das Grid sein sollte, nichts angezeigt Es ist in keiner Tabelle oder sonstwas geschachtelt (das habe ich aber auch schon probiert)...
Wenn ich mit dem Debugger den Code durchlaufe, werden auch schon sämtliche Listendaten ausgelesen, nur halt nicht angezeigt. Irgendwie blicke ich nicht mehr wirklich durch im Moment...

 Weiß da jemand Rat? Danke!

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 30 Aug. 2010 21:49
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Schmeiße das grid = new SPGridView() aus OnLoad raus. Das Grid wird ja bereits deklarativ in der aspx erstellt und Du erzeugst damit ein neues.

PS: Datenbindung sollte man nicht in OnLoad sondern z.B. in OnPreRender machen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
643 Beiträge
Henning Eiben Als Antwort am 31 Aug. 2010 09:38
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ganze anlegen von Columns usw. würde ich alles in CreateChildControls machen.

Was das DataBind angeht, so kann es durchaus notwendig sein, das bereits in OnLoad zu machen. Z.B. habe ich in meinem SPGridView das Filtern und Sortieren aktiviert. Dazu muss das Binding vor der Event-Verarbeitung durchgeführt werden - damit bleibt für das DataBind nur OnLoad.

Aber ansonsten würde ich das DataBind auch immer so spät wie möglich ausführen.

Henning Eiben
busitec.de

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 30 Aug. 2010 22:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

danke Andi!

Das habe ich heute schon im laufe des Tages umgestellt und nu funktionierts auch fast so wie ichs haben will... ich bekomme allerdings immer zwei Spalten mit dem gleichen Inhalt angezeigt sobald ich "BoundField" usw. mit reinnehme - lasse ich es weg, bekomme ich nur eine Spalte. Allerdings brauche ich das "BoundField", da ich damit den Link zum Dokument ordentlich darstellen und "klickbar" machen kann.

Code sieht ca. so aus:

OnPrerender:
this.formularGrid.AutoGenerateColumns = false;
BoundField colName = new BoundField();
colName.DataField = "Name";
colName.HtmlEncode = false;
this.formularGrid.Columns.Add(colName);
          
this.formularGrid.DataSource = fillDataTables(site, item, "Listenname", filterProdukt);
this.formularGrid.DataBind();

filldatatables-Methode:
SPList myList = site.Lists[list];
SPListItemCollection results = myList.Items;
DataTable myTable = new DataTable();
myTable.Columns.Add("Name");
DataRow row;

foreach (string value in stringArray)
{
  if (value.Equals(filter))
  {
    row = myTable.Rows.Add();
    row["Name"] = "<a href =\"" + site.Url + "/" + list + "/" + result["Name"].ToString() + "\">" + result["Name"].ToString() + "</a>"; 

    break;
  }
}

Irgendeine Anmerkung?

Danke mal wiedermal... ;-)

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 31 Aug. 2010 09:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ganz habe ich Dein Problem nicht verstanden, aber evtl. reicht Dir schon ein HyperlinkField statt dem BoundField.

Wenn Du die volle Flexibilität haben möchtest, dann nimm ein TemplateField. Diesem verpaßt Du als ItemTemplate eine eigene Klasse, die ITemplate implementiert. Das TemplateField nimmt optional noch weitere Templates auf wie z.B. HeaderTemplate.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 31 Aug. 2010 09:34
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

das Problem vor dem ich derzeit stehe ist, dass durch das BoundField eine komplett neue Spalte erstellt wird, die aber den gleichen Inhalt wie die Spalte des DataTables erhält. Der einzige Unterschied ist, dass ich durch das BoundField die Daten als Hyperlink formatieren kann (HtmlEncode = false).

Ergebniss des oben geposteten Codes sieht ca. so aus (zwei Spalten durch || getrennt):
<a href=http://... >Link </a>    ||   Link (als Hyperlink formatiert)

Ich bräuchte aber nur die Spalte, die als Hyperlink formatiert wird, weiß aber nicht, wie ich dem DataTable sage, dass es keine Spalte anlegen soll ;-)

Die Lösung mit dem TemplateFIeld habe ich auch schon gefunden, aber noch nicht ganz verstanden.

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 31 Aug. 2010 10:24
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Christian,

und warum nimmst Du dann nicht einfach nur ein HyperlinkField? Hast Du den Link bereits fertig in der Datenquelle (als <a href="" usw.). Dann bleibt wohl nur das TemplateField.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 31 Aug. 2010 10:54
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hallo Andi,

das mit dem normalen Hyperlink-Control hatte ich auch schon auf dem Schrim, allerdings wird mir da im Grid immer System.Web.UI.WebControls.Hyperlink ausgegeben und nicht der entsprechende Name...

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 31 Aug. 2010 13:55
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hiermit bekomme ich es jetzt zumindest hin, dass mir das Element im Grid als Hyperlink angezeigt wird...
<SharePoint:SPGridView runat="server" ID="formularGrid" AutoGenerateColumns="false" RowStyle-BackColor="#DDDDDD" AlternatingRowStyle-BackColor="#EEEEEE" ShowHeader="false">
   <Columns>
         <asp:HyperLinkField DataTextField="Name" DataNavigateUrlFields="Name" NavigateUrl="../~/Formulare/" />
    </Columns>
</SharePoint:SPGridView>

Allerdings wird die Url nicht wirklich ersetzt, sprich, der Link verweist nicht auf die Bibliothek in dem die Dokumente liegen, sondern immer auf den derzeitigen Pfad in dem sich das Grid befindet...
Gibt es irgendwo ein brauchbares Beispiel wie ich das ItemTemplate nutzen kann (am besten mit Erklärung). Die Beispiele im Netz finde ich recht lückenhaft, da kaum auf Hintergründe eingegangen wird.

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 31 Aug. 2010 14:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Eine gute und ausführliche Anleitung kenne ich auch nicht. Ich hatte mich seinerzeit selbst durchgekämpft. Ein Codebeispiel bekomme ich leider auch nicht auf die Schnelle zusammengebastelt, aber das hier sollte Dir doch für's Erste helfen:
http://www.reversealchemy.net/blog/2009/07/08/building-a-spgridview-control-intermezzo-templatefields-and-the-rowcommand-event/

Wenn man den Dreh mal raus hat, kann man damit wirklich nützliche Dinge tun. Es lohnt sich also.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
1714 Beiträge
C.Kaiser Als Antwort am 31 Aug. 2010 14:12
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

habs jetzt erstmal so gelöst... (bin auch gerade arg angenrvt von dem Problem):

  • zweite Spalte in DataTable gebaut: "NaviUrl" bestehend aus web.url + Listenname + Itemname
  • NaviUrl in DataNavigateUrlFields zugewiesen (siehe unten)


<SharePoint:SPGridView runat="server" ID="formularGrid" AutoGenerateColumns="false" RowStyle-BackColor="#DDDDDD" AlternatingRowStyle-BackColor="#EEEEEE" ShowHeader="false">
   <Columns>
         <asp:HyperLinkField DataTextField="Name" DataNavigateUrlFields="NaviUrl" NavigateUrl="" />
    </Columns>
</SharePoint:SPGridView>

Ist erstmal nicht soooooo schön und elegant, funktioniert aber.
Den Link werde ich mir trotzdem mal zur Brust nehmen... wenn ich mich ein wenig beruhigt habe ;-)

Beste Grüße,
Christian

http://www.sharepoint-rhein-ruhr.de

Ohne Rang
929 Beiträge
Thomas Östreich Als Antwort am 31 Aug. 2010 17:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Hätte da auch noch einen guten Link zum SPGridView, hier wird dann aber das SPMenuField verwendet.

http://blogs.msdn.com/b/powlo/archive/2007/02/25/displaying-custom-data-through-sharepoint-lists-using-spgridview-and-spmenufield.aspx