Domanda

In uno SharePoint webpart io sono la visualizzazione di uno SPGridView. Il controllo SPGridView è all'interno di un UpdatePanel Ajax ed è destinato a un DataTable nel codice.

Le colonne per il GridView vengono creati per lo più come templatefields, v'è un solo BoundField. Ho creato una classe che eredita ITemplate che produce l'ItemTemplate per i templatefields. Questa classe gestisce anche l'associazione dati dei controlli alle colonne / dati nel DataTable.

Ho un pulsante al di fuori della griglia, che se cliccato è stato progettato per salvare le modifiche apportate ai dati nella GridView al database datatable e fondamentale.

Il problema è che non riesco a ottenere un riferimento ai controlli all'interno del GridView nei pulsanti 'onclick' evento, sono scorrendo le righe della GridView e utilizzando il seguente codice per ottenere un riferimento al controllo:

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

È possibile che questo è sempre nullo e il cast non funziona. Qualcuno può capannone luce su questo? Suppongo che sia qualche tipo di problema ViewState, ma non sono sicuro.

Ho inviato alcuni esempi di codice più in basso.

Grazie,

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

    }
È stato utile?

Soluzione 2

Grazie per le risposte - ho trovato il problema, alla fine,

.

I stato ri-allestendo le colonne della griglia nel metodo CreateChildControls e anche loro istituzione ricostituiti in caso SelectedIndexChanged di un DropDownList.

La ragione di questo è originariamente esigenze griglia per avere diverse colonne aggiunte ad esso a seconda del valore scelto in discesa, ma questo non è noto nel caso CreateChildControls.

Impostazione della griglia come questo due volte causato i controlli in qualche modo scomparire dalla collezione pagine controlli in modo che quando ho provato a lanciare loro indietro ho sempre avuto nulla.

ora sto non allestendo le colonne della griglia due volte e funziona benissimo - grazie per il vostro aiuto

Altri suggerimenti

Si dovrebbe controllare il tipo di DataRow come prima riga credo sarà la riga di intestazione si può fare questa riga usando è DataRow.

Abbiamo avuto un problema simile un po 'indietro, a parte che l'approccio per lanciare il controllo è lo stesso approccio che ho preso in molte occasioni.

fatemi sapere come si ottiene.

Saluti Simon

Ho visto si comportano stranamente SPGridView dopo postback in uno dei miei pezzi web personalizzati, per esempio rendendo le righe, ma non il rendering dei contenuti per le cellule in quelle righe.

Si potrebbe provare a riscrivere temporaneamente ad basta utilizzare il .NET GridView, al posto del SPGridView, e vedere se questo fa alcuna differenza. Se quello non riesce così, allora non v'è probabilmente un po 'da qualche bug nel codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top