Question

Dans un SharePoint Webpart Je l'affichage d'un SPGridView. La commande de SPGridView est à l'intérieur d'un UpdatePanel Ajax et est lié à une table de données dans le code.

Les colonnes GridView sont créés principalement comme templatefields, il n'y a qu'un seul BoundField. J'ai créé une classe héritant ITemplate qui produit le itemtemplate pour les templatefields. Cette classe gère également la liaison de données des contrôles aux colonnes / données dans le datatable.

J'ai un bouton en dehors de la grille qui lorsque vous cliquez dessus est conçu pour enregistrer les modifications apportées aux données dans le gridview la base de données sous-jacente et datatable.

Le problème est que je ne peux pas obtenir une référence aux contrôles dans le gridview dans les boutons événement « onclick », je suis itérer à travers les lignes de la gridview et en utilisant le code suivant pour obtenir une référence au contrôle:

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

Ce qui précède est toujours nul et la distribution ne fonctionne pas. Quelqu'un peut-il nous éclairer à ce sujet? Je suppose qu'il est une sorte de problème, mais je ne suis pas viewstate sûr.

J'ai posté quelques autres exemples de code ci-dessous.

Merci,

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();

    }
Était-ce utile?

La solution 2

Merci pour les réponses - je trouve le problème à la fin

.

J'étais réinitialisant les colonnes de la grille dans la méthode CreateChildControls et les mettre également à nouveau en cas SelectedIndexChanged d'un DropDownList.

La raison est à l'origine des besoins de grille pour avoir des colonnes ajoutées à elle en fonction de la valeur choisi dans le menu déroulant, mais ce n'est pas connu en cas CreateChildControls.

La mise en place de la grille comme ceci deux fois provoqué les contrôles à dissapear en quelque sorte dans les pages collection de contrôles quand j'ai essayé de les jeter en arrière, je null toujours obtenu.

Je suis maintenant de ne pas configurer les colonnes de la grille deux fois et il fonctionne très bien - merci pour votre aide

Autres conseils

Vous devriez vérifier le type de DataRow comme la première ligne, je pense, sera la ligne en-tête, vous pouvez le faire en utilisant la ligne est DataRow.

Nous avons eu un problème similaire un certain temps, à part que l'approche de lancer la commande est la même approche que j'ai pris à plusieurs reprises.

laissez-moi savoir comment vous allez.

Cordialement Simon

Je l'ai vu se comporter étrangement SPGridView après postbacks dans l'une de mes parties Web personnalisées, par exemple l'affichage de lignes, mais pas le rendu du contenu des cellules dans ces lignes.

Vous pouvez essayer de réécrire temporairement à simplement utiliser le GridView .NET, au lieu du SPGridView, et voir si cela fait une différence. Si que l'on échoue aussi bien, alors il y a probablement quelque part bug dans votre code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top