Newsgroup: it.comp.www.asp
Titolo: evento datagrid.ItemCreated per il footer invocato 2 volte

Ho un datagrid in cui mostro il Footer in posizione Bottom.
Il footer lo imposto dinamicamente (con la procedura sotto riportata),
facendolo diventare una sola cella contenente l'indicazione del numero
di pagine e del numero di righe.
Public Sub ItemCreated(ByVal s As Object, ByVal e As
DataGridItemEventArgs) Handles dgStr.ItemCreated
   Dim elType As ListItemType = CType(e.Item.ItemType, ListItemType)
   If (elType = ListItemType.Footer) Then
      Dim tcc As TableCellCollection = e.Item.Cells
      Dim nTotalCols As Int16 = tcc.Count()
      Dim i As Int16
            ' elimino tutte le celle tranne una
            For i = 0 To nTotalCols - 2
                tcc.RemoveAt(1)
            Next
            Dim c As TableCell = tcc.Item(0)
            c.ColumnSpan = nTotalCols
            Dim dg As DataGrid = CType(s, DataGrid)
            c.Text = "Pagine " & dg.PageCount.ToString & _
                     "; Righe " & CType(dg.DataSource, DataView).Count
   end if
end sub
La prima volta che viene creata la pagina, la procedura ItemCreated
viene richiamata per l'elemento footer una sola volta e tutto
funziona.
Quando cambio pagina nel datagrid, viene invocata la procedura
ItemCreated per l'elemento footer, poi la procedura PageLoad e poi di
nuovo la  procedura ItemCreated per l'elemento footer.
La prima volta che viene invocato ItemCreated per l'elemento footer
CType(dg.DataSource, DataView) restituisce nothing e la procedura va
in errore;
la seconda volta invece CType(dg.DataSource, DataView) restituisce il
dataview.
Come mai viene invocato ItemCreated per l'elemento footer due volte,
quale è la sequenza di eventi e la loro logica??
Grazie in anticipo a chi mi risponde,
--
Robynet

 quale è la sequenza di eventi e la loro logica??
E' un problema di cui aveva parlato Dino Esposito nell'ultimo Roadshow 
di Microsoft riguardo ai datagrid e sembrerebbe un bug :|
Dino aveva risolto il problema con un boolean che setta a True nel 
momento del ondatabinding al primo postback. Tale variabile poi viene 
controllata nel momento dell'onitemcreated.
Non so se i sono spiegato bene :)
Cmq guarda questo codice, che è meglio ;)
Provalo sia utilizzando la var m_isBindingData sia senza e vedi la 
differenza nel Trace
<%@ Page Language="VB" Trace="true"%>
<%@ Import Namespace="System.Data"%>
<script runat="server">
Private m_isBindingData As Boolean = False
Sub Page_Load(sender As Object, e As EventArgs)
	m_isBindingData = False
 
	Dim objTable As New DataTable("tabella")
	objTable.Columns.Add("col1", System.Type.GetType("System.String"))
	objTable.Columns.Add("col2", System.Type.GetType("System.String"))
 
	Dim objDataRow as DataRow
	objDataRow = objTable.NewRow()
	objDataRow("col1") = "riga1"
	objDataRow("col2") = "riga2"
	objTable.Rows.Add(objDataRow)
	objDataRow = objTable.NewRow()
	objDataRow("col1") = "riga1"
	objDataRow("col2") = "riga2"
	objTable.Rows.Add(objDataRow)
	' Bind the data to the grid
	grid.DataSource = objTable
	grid.DataBind()
End Sub
Sub ItemCreated(sender As Object, e As DataGridItemEventArgs)
	If m_isBindingData Then
		Trace.Warn("Created " & e.Item.ItemType.ToString())
	End If
End Sub
Sub TraceDataBinding(sender As Object, e As EventArgs)
	m_isBindingData = True
	Trace.Warn("Data binding...")
End Sub
Sub ItemDataBound(sender As Object, e As DataGridItemEventArgs)
	Trace.Warn("Bound " & e.Item.ItemType.ToString())
End Sub
</script>
<html>
<title>[VB] Pro 
ASP.NET
 (Ch06)</title>
<body>
<form runat="server">
	<asp:datagrid runat="server" id="grid" allowpaging="true"
		onitemcreated="ItemCreated" onitemdatabound="ItemDataBound"
		ondatabinding="TraceDataBinding">
	</asp:datagrid>
	<br>
	<asp:linkbutton runat="server" text="Post back" />
</form>
</body>
</html>
ciao
-- 
Kappa [co-mod ICWA]
kappa(at)
webngo.net
www.webngo.net
www.filmscoop.it

 di Microsoft riguardo ai datagrid e sembrerebbe un bug :|
Grazie mille per la pronta risposta.
--
Robynet