Pregunta

En un SharePoint WebPart estoy mostrando una SPGridView. El control SPGridView es dentro de un UpdatePanel Ajax y está unido a una tabla de datos en el código.

Las columnas para el gridview se crean sobre todo como templatefields, sólo hay una BoundField. He creado una clase que hereda ITemplate que produce el itemtemplate para los templatefields. Esta clase también se encarga del enlace de datos de los controles de columnas / datos en la tabla de datos.

Tengo un botón fuera de la cuadrícula está diseñado para guardar los cambios realizados en los datos en el gridview a la base de datos y tabla de datos subyacente que cuando se hace clic.

El problema es que no puedo obtener una referencia a los controles dentro del gridview en los botones 'onclick' caso, estoy iteración a través de las filas de la gridview y usando el siguiente código para obtener una referencia al control:

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

Lo anterior es siempre nula y el reparto no funciona. ¿Alguien puede aclarar esto? Lo que supongo que es algún tipo de problema de estado de vista, pero no estoy seguro.

He publicado algunos ejemplos de código más abajo.

Gracias,

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

    }
¿Fue útil?

Solución 2

Gracias por las respuestas - He encontrado el problema en el extremo

.

Me fue re-estableciendo las columnas de la cuadrícula en el método CreateChildControls y también la que fueron creados de nuevo en caso SelectedIndexChanged de un DropDownList.

La razón de esto es originalmente las necesidades de la red para tener diferentes columnas añadidas a la misma en función del valor elegido en el menú desplegable, pero esto no se conoce en el caso CreateChildControls.

Configuración de la red como esto dos veces causado a los controles de alguna manera desaparecen de la colección de páginas controles por lo que cuando traté de echarlos atrás que siempre nos dieron nula.

Ahora no estoy montando las columnas de cuadrícula dos veces y funciona muy bien - gracias por su ayuda

Otros consejos

Se debe comprobar el tipo de DataRow como la primera fila que creo que será la fila de cabecera que puede hacer uso de esta fila es DataRow.

Hemos tenido un problema parecido un tiempo atrás, además de que el enfoque a emitir el control es el mismo enfoque que he tenido en muchas ocasiones.

que me haga saber cómo le va.

Saludos Simon

He visto la SPGridView se comportan extrañamente después de las devoluciones de datos en uno de mis elementos web personalizados, por ejemplo renderizado filas pero no representar el contenido de las células en esas filas.

Usted podría intentar volver a escribir de forma temporal sólo tiene que utilizar el .NET GridView, en lugar de la SPGridView, y ver si hay alguna diferencia. Si no logra que uno así, entonces es probable que haya algún error en alguna parte en el código.

Licenciado bajo: CC-BY-SA con atribución
scroll top