Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717

    [2.0-VB.NET] GridView - Colonne dinamiche e RowCommand

    Ciao a tutti,
    sto provando a migrare dal vecchio DataGrid al nuovo GridView di ASP.NET 2.0.
    Mi è successa una cosa strana e tuttora non ho trovato una soluzione definitiva.

    Ho una WebForm con una GridView:
    codice:
    <asp:GridView ID="grvEsempio" runat="server">
      <Columns>
       <asp:TemplateField>
         <ItemTemplate>
            <asp:Button ID="cmdPippo" runat="server" CausesValidation="false" CommandName="Pippo" Text="Pippo" CommandArgument='<%# Eval("field_1") %>' />
          </ItemTemplate>
        </asp:TemplateField>
      </Columns>
    </asp:GridView>
    Le colonne del datagrid le aggiungo dinamicamente a runtime sul Page_Load:
    codice:
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      If (Not Page.IsPostBack) Then
        bindGrid()
      End If
    End Sub
    
    Private Sub bindGrid()
      dim dt as DataTable
    
      ' Riempio il datatable
      dt = ...
    
      ' Aggiungo le colonne al GridView
      For Each dc As DataColumn In dt.Columns
        Dim l_oCol As New BoundField
        l_oCol.DataField = dc.ColumnName
        l_oCol.HeaderText = dc.ColumnName
        grvDynamic.Columns.Add(l_oCol)
      Next
    
      grvEsempio.DataSource = dt
      grvEsempio.DataBind()
    End Sub
    Ho un gestore dell'evento RowCommand che funziona perfettamente:
    codice:
    Private Sub grvEsempio_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles grvEsempio.RowCommand
      ' Riempio una label con il CommandName e il CommandArgument
      Select Case (e.CommandName)
        Case "Pippo"
          ' Faccio le mie operazioni
          ...
      End Select
    End Sub
    Se stranamente aggiungo le colonne prima della colonna con il pulsante anziché dopo con questo codice:
    codice:
    Private Sub bindGrid()
      dim dt as DataTable
    
      ' Riempio il datatable
      dt = ...
    
      ' Aggiungo le colonne al GridView
      Dim l_iIdx As Integer = 0
      For Each dc As DataColumn In dt.Columns
        Dim l_oCol As New BoundField
        l_oCol.DataField = dc.ColumnName
        l_oCol.HeaderText = dc.ColumnName
        grvDynamic.Columns.Insert(l_iIdx, l_oCol)
        l_iIdx += 1
      Next
    
      grvEsempio.DataSource = dt
      grvEsempio.DataBind()
    End Sub
    L'evento RowCommand non scatta più.

    A voi vi è mai capitato? Come posso risolvere?

    Grazie a tutti.
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

  2. #2
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717
    up
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

  3. #3
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717
    up
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    559
    Che strana sta cosa....
    ora non ho tempo per provarla (ma mi incuriosisce!)

    pero' potri provare a consigliarti di impostargli esplicitamente l'evento RowDatabound dopo che hai aggiunto le colonne (e prima del databind):

    myGrid.OnRowDataBound+= new GridViewRowEventHandler(tuoMetodoDiGestione);

    nn so se risolva la cosa, ma spero di averti dato uno spunto!
    se nella vita avro avuto la possiblita di aiutare qualcuno non avro vissuto invano (E. Dikinson)

  5. #5
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717
    Originariamente inviato da stefanomnn
    Che strana sta cosa....
    ora non ho tempo per provarla (ma mi incuriosisce!)

    pero' potri provare a consigliarti di impostargli esplicitamente l'evento RowDatabound dopo che hai aggiunto le colonne (e prima del databind):

    myGrid.OnRowDataBound+= new GridViewRowEventHandler(tuoMetodoDiGestione);

    nn so se risolva la cosa, ma spero di averti dato uno spunto!
    Grazie per la risposta... Dopo estenuanti ricerche ho scoperto che si tratta di un bug documentato del metodo Insert che resetta il viewstate del template-field, cosa che non avviene con il metodo Add.

    Questo è il link che lo documenta, per chi dovesse trovarsi nella mia stessa situazione:
    https://connect.microsoft.com/Visual...&wa=wsignin1.0

    Ciao.
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    559
    ma allora quella istreuzione che dicevo prima dovrebbe funzionare
    :-)
    se nella vita avro avuto la possiblita di aiutare qualcuno non avro vissuto invano (E. Dikinson)

  7. #7
    Utente di HTML.it L'avatar di jesus
    Registrato dal
    Jan 2002
    Messaggi
    717
    Originariamente inviato da stefanomnn
    ma allora quella istreuzione che dicevo prima dovrebbe funzionare
    :-)
    no purtroppo non funziona.
    <%= Jesus %>
    "Non hai veramente capito qualcosa fino a quando non sei in grado di spiegarlo a tua nonna" - Albert Einstein.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.