¿Por qué no puedo cambiar el valor en una fila específica en el evento rowdatabound de mi vista de cuadrícula? el código está ingresando donde el valor está establecido en Prueba pero aún muestra el valor anterior?

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="au_id" DataSourceID="SqlDataSource1" 
    ondatabinding="GridView1_DataBinding" onrowdatabound="GridView1_RowDataBound">
    <Columns>
        <asp:BoundField DataField="au_id" HeaderText="au_id" ReadOnly="True" 
            SortExpression="au_id" />
        <asp:BoundField DataField="au_lname" HeaderText="au_lname" 
            SortExpression="au_lname" />
        <asp:BoundField DataField="au_fname" HeaderText="au_fname" 
            SortExpression="au_fname" />
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:pubsConnectionString %>" 
    SelectCommand="SELECT [au_id], [au_lname], [au_fname] FROM [authors]">
</asp:SqlDataSource>


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var row = ((DataRowView)e.Row.DataItem).Row;

        var customerName = row.Field<String>("au_lname");
        if (customerName == "Carson")
        {
            customerName = "Test";
        }
    } 
}
1
Rod 20 mar. 2012 a las 17:36
Está cambiando el valor de la variable customerName, no los datos de la fila.
 – 
Muhammad Hasan Khan
20 mar. 2012 a las 17:39

1 respuesta

La mejor respuesta

Porque no puede cambiar el origen de datos subyacente en RowDataBound (demasiado tarde). Debe aplicar sus cambios a los controles TemplateFields o al CellCollection de la fila (en el caso de BoundFields o AutogenerateColumns=true):

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataRow row = ((DataRowView)e.Row.DataItem).Row;
        var customerName = row.Field<String>("au_lname");
        if (customerName == "Carson")
        {
            e.Row.Cells[1].Text = "Test";
        }else
        {
            e.Row.Cells[1].Text = customerName;
        }
    }
}
1
Tim Schmelter 20 mar. 2012 a las 17:41