none
gridview.selectedindexchanged no funciona correctamente RRS feed

  • Pregunta

  • Hola a todos:

    Tengo un gridview

                <asp:GridView ID="gvdesglose_obras" DataSourceID="sqldsdesglose_obras" SortedAscendingHeaderStyle-BackColor="Blue" SortedDescendingHeaderStyle-BackColor="BlueViolet" width="100%" HeaderStyle-CssClass="subtitulo" AllowPaging="true" AllowSorting="true" AutoGenerateColumns="false" DataKeyNames="id0" runat="server">
                    <Columns>
                        <asp:CommandField ButtonType="Link" ShowSelectButton="true" />
                    </Columns>
                </asp:GridView>
    

    En el codebehind

        Sub seleccionar_desglose_obras(ByVal s As Object, ByVal e As EventArgs) Handles gvdesglose_obras.SelectedIndexChanged
            Dim lnkb As LinkButton = DirectCast(s.SelectedRow.Cells(0).Controls(0), LinkButton), intindice As Integer = s.SelectedIndex, strcriterio As String = txtcriterio.Text
            Dim intobra As Integer = Request.QueryString("obra"), strmoneda As String = Nothing, strcampo As String = ddlcampos.SelectedItem.Text, strcriterios As String = Nothing
            If lblcriterios.Text <> "" Then strcriterios = "&crt=" & strcampo & "~" & strcriterio
            sqldsdetalle_obras.SelectParameters("id0").DefaultValue = s.SelectedValue
            Response.Write("intobra=" & intobra)
            Response.Write("s.SelectedValue=" & s.SelectedValue)
        End Sub
    

    Y s.selectedvalue es nulo. No sé por qué. La clave id0 da un número válido, lo comprobé haciendo eval("id0").

    ¿Qué puede ser?

    Gracias de antemano

    martes, 31 de marzo de 2015 7:03

Respuestas

  • Hola:

    Lo resolví poniendo gridview.databind() antes de hacer referencia a s.selectedvalue, así rellena el datakeys.

    Pero  no debería de ser necesario hacer el databind

    Es algo raro eso. ¿Por qué puede ser que no rellene?

    Gracias de antemano

    • Marcado como respuesta volar.2014 jueves, 2 de abril de 2015 6:42
    jueves, 2 de abril de 2015 6:42

Todas las respuestas

  • Yo no programo VB.net, solamente C#, pero me parece que habría algo malo ahí porque la variable s es de tipo Object y el tipo de datos Object no tienen una propiedad SelectedIndex.  ¿Me puede asegurar que VB.net automáticamente hace la conversión de Object a GridView?  Si no me lo puede asegurar, le recomiendo que trate una conversión explícita en una nueva variable.  Imagino que sería algo como:

    Dim gv As GridView = CType(s, GridView)

    Creo que algo así.  Luego trate de acceder al valor de SelectedIndex a través de la variable gv.


    Jose R. MCP
    Code Samples

    martes, 31 de marzo de 2015 13:21
    Moderador
  • hola

    lo primero que puedo mencionar es que no definas codigo en una sola linea es muy dificil de entender esa bola de codig, ubica cada instruccion en una linea diferente

    pero la "s" representa al GridView, no entiendo como esperas usar el SelectedValue

    deberias usar

    Dim grid As GridView= DirectCast(s, GridView)

    entonces sigue usando la variable "grid" y veras que esta no tinee  ningun SelectedValue

    no se que otras columnas defines en el gridview, peor si estas ubicando un combo como parte de una columna no veo que lo estes accediendo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 31 de marzo de 2015 13:48
  • Hola de nuevo:

    Gracias a los dos.

    La s es el gridview. Si hago

    Dim grid As GridView= DirectCast(s, GridView)

    es lo mismo que usar s directamente. Me hace la conversión directamente.

    Tengo otro gridview muy parecido y me funciona correctamente. Tal vez ahora no me funcione porque tengo algo mal en el html, pero no logro saber qué

    Gracias de antemano

    martes, 31 de marzo de 2015 18:12
  • >>La s es el gridview. Si hago Dim grid As GridView= DirectCast(s, GridView) es lo mismo que usar s directamente.

    no, no es lo mismo

    porque al castear trabjas con un objeto tipado, habilita el Option Strict en vb.net y veras que ya no tienes esa conversion automatica la cual no recomiendo para nada, solo te trae problemas porque estas definiendo propiedades en un objeto que no las tiene

    >>Tengo otro gridview muy parecido y me funciona correctamente

    sera de casualidad, solo puedo decir que el codigo que muestras es pesimo, no defines lines para da instruccion, ni respetas los tipos de datos

    castea los objetos a los tipos correcto para programar correctamente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 31 de marzo de 2015 18:25
  • Hola de nuevo:

    Hice

            Dim row As GridViewRow = gvdesglose_obras.SelectedRow
    
            Dim id As Integer = gvdesglose_obras.DataKeys(row.RowIndex).Value
    

    siguiendo el enlacd del blog de Leandro

    El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección.
    Nombre del parámetro: index

    Con lo que concluyo que no me rellena la tabla de datakeynames. ¿Por qué puede ser eso?

    Gracias de antemano

    http://ltuttini.blogspot.com.es/2011/06/aspnetgridview-como-seleccionar-una.html

    Y ahora me da error en esa línea de código diciendo

    miércoles, 1 de abril de 2015 13:39
  • Hola:

    Lo resolví poniendo gridview.databind() antes de hacer referencia a s.selectedvalue, así rellena el datakeys.

    Pero  no debería de ser necesario hacer el databind

    Es algo raro eso. ¿Por qué puede ser que no rellene?

    Gracias de antemano

    • Marcado como respuesta volar.2014 jueves, 2 de abril de 2015 6:42
    jueves, 2 de abril de 2015 6:42