Frage

In einem SharePoint -Webpart zeige ich eine SPGridView. Das SPGridView -Steuerelement befindet sich in einem AJAX -UpdatePanel und ist an einen DataTable im Code gebunden.

Die Spalten für die Gridview werden hauptsächlich als Vorlagenfelder erstellt, es gibt nur ein Boundfield. Ich habe eine Klasse erstellt, die die Elementplatte erbt, die die ItemTemplate für die Vorlagenfelder erstellt. Diese Klasse übernimmt auch die Datenbank der Steuerelemente zu Spalten/Daten im DataTable.

Ich habe eine Schaltfläche außerhalb des Rasters, die beim Klicken so konzipiert ist, dass die Änderungen an den Daten in der GridView in der Databable und zugrunde liegenden Datenbank vorgenommen werden.

Das Problem ist, dass ich keinen Verweis auf die Steuerelemente innerhalb des Gridview im Ereignis "Onclick" in den Schaltflächen erhalten kann. Ich mache die Zeilen in der Gridview durch und verwende den folgenden Code, um einen Verweis auf das Steuerelement zu erhalten:

foreach (SPGridViewRow row in grid.Rows)
        {
            TextBox txtExamMark = (TextBox)row.FindControl("txtExamMark");

Das obige ist immer null und die Besetzung funktioniert nicht. Kann jemand das Licht darüber werfen? Ich gehe davon aus, dass es sich um eine Art Ansichtsstaat -Problem handelt, aber ich bin mir nicht sicher.

Ich habe unten weitere Code -Beispiele gepostet.

Vielen Dank,

Alex

 public class CustomSPGridViewTemplate : ITemplate
{
    string columnName;
    string controlType;

    int controlWidth;

    ListItemCollection itemColl;

    string txtMode;

    public CustomSPGridViewTemplate(string ctype,string colname,ListItemCollection itemcol,string mode,int cWidth)
    {
        columnName = colname;
        controlType = ctype;
        itemColl = itemcol;
        controlWidth = cWidth;
        txtMode = mode;
    }

    public void InstantiateIn(System.Web.UI.Control container)
    {
        if (controlType == "TextBox")
        {
            TextBox txtBox = new TextBox();
            txtBox.ID = "txt" + columnName;
            txtBox.Visible = true;
            txtBox.Width = Unit.Pixel(controlWidth);
            txtBox.DataBinding += new EventHandler(txtBox_DataBinding);
            if (txtMode == "MultiLine")
            {
                txtBox.TextMode = TextBoxMode.MultiLine;
            }
            container.Controls.Add(txtBox);
        }
        if (controlType == "PupilImage")
        {
            Image pupilImage = new Image();
            pupilImage.ID = "pupilImage";
            pupilImage.Visible = true;
            pupilImage.DataBinding += new EventHandler(pupilImage_DataBinding);
            container.Controls.Add(pupilImage);
        }
        if (controlType == "DropDown")
        {
            DropDownList dropDown = new DropDownList();
            dropDown.ID = "ddl" + columnName;
            dropDown.Visible = true;             
            dropDown.DataBinding += new EventHandler(dropDown_DataBinding);
            container.Controls.Add(dropDown);
        }
    }

    void txtBox_DataBinding(object sender, EventArgs e)
    {
        TextBox txtBox = (TextBox)sender;
        SPGridViewRow container = (SPGridViewRow)txtBox.NamingContainer;
        txtBox.Text = DataBinder.Eval(container.DataItem, columnName).ToString();

    }
War es hilfreich?

Lösung 2

Vielen Dank für die Antworten - ich habe das Problem am Ende gefunden.

Ich habe die Gittersäulen in der Methode CreateChildControls neu gestellt und sie auch im ausgewählten Ereignis einer Dropdownliste eingerichtet.

Der Grund dafür ist ursprünglich, dass das Gitter je nach dem in der Dropdown ausgewählten Wert unterschiedliche Spalten hinzugefügt werden muss. Dies ist jedoch im Ereignis von CreateChildControls nicht bekannt.

Das Einrichten des Gitters wie dieses zweimal ließ die Steuerelemente irgendwie von der Sammlung der Seitensteuerung entfalten. Als ich versuchte, sie zurückzuwerfen, bekam ich immer Null.

Ich richte jetzt nicht zweimal die Gittersäulen ein und es funktioniert großartig - danke für deine Hilfe!

Andere Tipps

Sie sollten die Art von Datarow überprüfen, da die erste Zeile, von der ich glaube, dass sie die Header -Zeile sein wird, die Sie mit einer Reihe von DataRow tun können.

Vor einiger Zeit hatten wir ein ähnliches Problem, abgesehen davon, dass der Ansatz, die Kontrolle zu besetzen, der gleiche Ansatz ist, den ich bei vielen Gelegenheiten gewählt habe.

Lassen Sie mich wissen, wie Sie losgehen.

Grüße Simon

Ich habe gesehen, wie sich die SPGridView seltsamerweise nach Postbacks in einem meiner benutzerdefinierten Webteile verhalten hat, z. B. Zeilen, aber keinen Inhalt für Zellen in diesen Zeilen rendert.

Sie könnten versuchen, es vorübergehend neu zu schreiben, um nur das .NET -Gridview anstelle der SPGridView zu verwenden, und festzustellen, ob dies einen Unterschied macht. Wenn dieser auch fehlschlägt, gibt es wahrscheinlich irgendwo in Ihrem Code einen Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top