Newsgroup: it.comp.www.asp
Titolo: Problema con DataGrid paginata e ButtonColumn

 Ciao,
ho un problema con una datagrid paginata: in pratica, da un frame laterale
seleziono un tipo di ricerca e il numero di risultati che voglio per pagina.
il frame di destra genera una datagrid paginata con i dati ricercati,
aggiungendo una ButtonColumn con un pulsante di selezione per ogni riga.
Questo pulsante verra' usato per fare il submit del valore di uno o piu'
campi della riga ad un'altra form (si tratta di implementare un carrello).
Funziona tutto, ma solo nella prima parte di risultati. Dalla seconda pagina
in poi ottengo l'errore:
--------------
Exception Details: System.ArgumentOutOfRangeException: Specified argument
was out of the range of valid values. Parameter name: index
Source Error:
Line 130:sub dgrdQuerySearch_ItemCommand(Sender As object, E As
DataGridCommandEventArgs)
Line 131:	<%-- L'errore e' qui! --%>
Line 132:	Testo.Text = e.Item.Cells(2).Text
Line 133:
Line 134:	e.item.Font.Bold = True
Source File:
D:\Linguaggi\HTML\
ASP.NET
\GPWay_Site\content\ecommerce\ecommerce_execute_que
ry.aspx    Line: 132
--------------
Allego il codice completo della pagina:
----------------------------------------
<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace = "System.Data.SQLClient" %>
<%@ Import Namespace = "System.Data" %>
<!-- #INCLUDE FILE="../../funzioni/gpway_funzioni.aspx" -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
 <title></title>
</head>
<script runat="Server">
Dim strSQLSearchString, strSceltaSelezione, strChiavericerca as string
Dim strPrezzoListino as string
Dim intTipoListino as integer
sub Page_Load
 Dim strLogin, strPassword, strIDCLiente as string
 Dim strProdotti, strDescrizione, strProduttore as string
 <%-- Setto la durata della sessione a 60 minuti --%>
 Session.Timeout = "60"
 <%-- Assegno alle variabili i valori delle SESSION --%>
 strLogin = UCase(Session("Login"))
 strPassword = UCase(Session("Password"))
 strIDCliente = UCase(Session("IDCliente"))
 intTipoListino = CInt(Session("Tipo_Listino"))
 strSceltaSelezione = UCase(Session("SceltaSelezione"))
 strProdotti = UCase(Session("Prodotti"))
 strDescrizione = UCase(Session("Descrizione"))
 strProduttore = UCase(Session("Produttore"))
 dgrdQuerySearch.PageSize = Session("RisultatiPerPagina")
 <%-- In base alla variabile 'strSceltaSelezione', decido la ricerca da
eseguire --%>
 if strSceltaSelezione.Trim = "PRODOTTI" then
  strSQLSearchString = "SELECT * FROM RigheListino WHERE Desc_Gruppo = '" &
strProdotti & "' ORDER BY IdProd ASC"
  strChiaveRicerca = strProdotti.Trim
 else if strSceltaSelezione.Trim = "PRODUTTORE" then
  strSQLSearchString = "SELECT * FROM RigheListino WHERE NomeProduttore = '"
& strProduttore & "' ORDER BY IdProd ASC"
  strChiaveRicerca = strProduttore.Trim
 else if strSceltaSelezione = "DESCRIZIONE" then
  strSQLSearchString = "SELECT * FROM RigheListino WHERE Descrizione LIKE
'%" & strDescrizione & "%' ORDER BY IdProd ASC"
  strChiaveRicerca = strDescrizione.Trim
 else if strSceltaSelezione = "PROMO" then
  strChiaveRicerca = "Promo"
 end if
 if not IsPostBack then
  BindDataGrid()
 end if
end sub
sub BindDataGrid()
 Dim colColonnaPrezzi as New BoundColumn()
 Dim dadQuerySearch as sqlDataAdapter
 Dim dstQuerySearch as DataSet
 <%-- Apro il database --%>
 OpenDatabase()
 dadQuerySearch = new SQLDataAdapter(strSQLSearchString, conPubs)
 dstQuerySearch = New Dataset
 dadQuerySearch.Fill(dstQuerySearch)
 lblQuerySearch.Text = "Ricerca per <b>" & strSceltaSelezione.Trim & "</b>
con chiave uguale a <b>" & strChiaveRicerca & "</b>. "
 <%-- Ottento il conteggio dei record in base alla ricerca effettuata --%>
 if dstQuerySearch.Tables(0).Rows.Count = 0 then
  lblNumRecordFound.Text = "Trovati <b>0</b> articoli."
 else if dstQuerySearch.Tables(0).Rows.Count = 1 then
  lblNumRecordFound.Text = "Trovato <b>" &
dstQuerySearch.Tables(0).Rows.Count & "</b> articolo.<br><br>"
  dgrdQuerySearch.DataSource = dstQuerySearch
 else
  lblNumRecordFound.Text = "Trovati <b>" &
dstQuerySearch.Tables(0).Rows.Count & "</b> articoli.<br><br>"
  dgrdQuerySearch.DataSource = dstQuerySearch
 end if
 <%-- Inserisco il titolo e la formattazione della colonna dei prezzi --%>
 colColonnaPrezzi.Headertext = "Prezzo Euro"
 colColonnaPrezzi.DataFormatString = "{0:N2}"
 colColonnaPrezzi.ItemStyle.HorizontalAlign = HorizontalAlign.Center
 colColonnaPrezzi.ItemStyle.VerticalAlign = VerticalAlign.Middle
 <%-- Assegno il campo del prezzo a seconda del tipo di listino assegnato al
cliente --%>
 select intTipoListino
 case 1
  colColonnaPrezzi.DataField = "Prezzo_Listino_1_Euro"
  strPrezzoListino = "_1_Euro"
 case 2
  colColonnaPrezzi.DataField = "Prezzo_Listino_2_Euro"
  strPrezzoListino = "_2_Euro"
 case 3
  colColonnaPrezzi.DataField = "Prezzo_Listino_3_Euro"
  strPrezzoListino = "_3_Euro"
 case 4
  colColonnaPrezzi.DataField = "Prezzo_Listino_4_Euro"
  strPrezzoListino = "_4_Euro"
 case 5
  colColonnaPrezzi.DataField = "Prezzo_Listino_5_Euro"
  strPrezzoListino = "_5_Euro"
 case 6
  colColonnaPrezzi.DataField = "Prezzo_Listino_6_Euro"
  strPrezzoListino = "_6_Euro"
 end select
 <%-- Visualizzo la colonna e faccio il bind --%>
 dgrdQuerySearch.Columns.AddAt(4, colColonnaPrezzi)
 dgrdQuerySearch.DataBind()
 CloseDatabase()
end sub
Sub dgrdQuerySearch_PageIndexChanged(s As Object, e As
DataGridPageChangedEventArgs)
 dgrdQuerySearch.CurrentPageIndex = e.NewPageIndex
 BindDataGrid()
End Sub
sub dgrdQuerySearch_ItemCommand(Sender As object, E As
DataGridCommandEventArgs)
 <%-- L'errore e' qui! --%>
 Testo.Text = e.Item.Cells(2).Text
 e.item.Font.Bold = True
 <%--
 Response.Redirect("ecommerce_carrello.aspx?NomeProduttore" &
System.Web.HttpUtility.UrlEncode())
 --%>
end sub
</script>
<body bgcolor="#FFFFFF">
<div style="position:absolute; top:10px; left:5px">
<asp:label ID="lblQuerySearch" Font-Names="Arial" Font-Size="10pt"
BackColor="#FFFFFF" ForeColor="#093654" runat="server"/>
<asp:label ID="lblNumRecordFound" Font-Names="Arial" Font-Size="10pt"
BackColor="#FFFFFF" ForeColor="#093654" runat="server"/>
</div>
<div style="position:absolute; top:35px; left:5px">
<form id="Carrello" runat="server">
<asp:DataGrid
 ID="dgrdQuerySearch"
 AutoGenerateColumns="False"
 Width="775px"
 GridLines="Both"
 BorderColor="#BCCCD7"
 AllowPaging="True"
 OnPageIndexChanged="dgrdQuerySearch_PageIndexChanged"
 OnItemCommand="dgrdQuerySearch_ItemCommand"
 Cellspacing="0"
 Cellpadding="3"
 HeaderStyle-Font-Name="Arial"
 HeaderStyle-Font-Size="8pt"
 HeaderStyle-HorizontalAlign="Center"
 HeaderStyle-VerticalAlign="Middle"
 HeaderStyle-BackColor="#3B5F77"
 HeaderStyle-ForeColor="#FFFFFF"
 ItemStyle-Font-Name="Arial"
 ItemStyle-Font-Size="8pt"
 ItemStyle-BackColor="#D4DEE5"
 ItemStyle-ForeColor="#093654"
 AlternatingItemStyle-Font-Name="Arial"
 AlternatingItemStyle-Font-Size="8pt"
 AlternatingItemStyle-BackColor="#A6BBCA"
 AlternatingItemStyle-ForeColor="#093654"
 PagerStyle-Mode="NumericPages"
 PagerStyle-Position="Bottom"
 PagerStyle-HorizontalAlign="Center"
 PagerStyle-VerticalAlign="Middle"
 PagerStyle-Font-Name="Arial"
 PagerStyle-Font-Size="9pt"
 PagerStyle-BackColor="#3B5F77"
 PagerStyle-ForeColor="#FFFFFF"
 Runat="Server">
 <Columns>
  <asp:BoundColumn HeaderText="ID Articolo" DataField="IDArt"/>
  <asp:BoundColumn HeaderText="Produttore" DataField="NomeProduttore"/>
  <asp:BoundColumn HeaderText="Codice Produttore" DataField="Cod_Art_Prod"/>
  <asp:BoundColumn HeaderText="Descrizione" DataField="Descrizione"/>
  <asp:BoundColumn HeaderText="Disponibile"
DataField="Disponibile"><ItemStyle HorizontAlalign="Center"
VerticalAlign="Middle"/></asp:BoundColumn>
  <asp:BoundColumn HeaderText="Arrivo" DataField="Arrivo"><ItemStyle
HorizontAlalign="Center" VerticalAlign="Middle"/></asp:BoundColumn>
  <asp:templatecolumn headertext="Quantit&agrave;">
   <itemtemplate>
    <center>
    <asp:TextBox id="txbQuantita" Text="1" Width="20px" MaxLength="4"
Font-Names="Arial" Font-Size="8pt" BackColor="#FFFFFF" ForeColor="#093654"
runat="server"/>
    </center>
   </itemtemplate>
  </asp:templatecolumn>
  <asp:ButtonColumn Text="Seleziona" ButtonType="PushButton"/>
 </Columns>
</asp:DataGrid>
<br><br>
<asp:label ID="Testo" runat="server"/>
</form>
</div>
</body>
</html>
----------------------------------------
Credo che il problema sia relativo a qualche tipo di indice che viene perso
durante la paginazione, ma essendo nuovo di 
ASP.NET
, non so bene come
risolvere il problema, che e' comunque localizzato nella
"dgrdQuerySearch_ItemCommand".
Qualcuno mi puo' aiutare?
-- 
Marlenio
e-mail: 
MLm....@tin.it
(Rimuovere "ML" dall'indirizzo)

 Marlenio
Il button che utilizzi per lanciare questo evento modificalo in questo modo:
<asp:ButtonColumn Text="Seleziona" CommandName="xPulsante"
ButtonType="PushButton"/>
Quindi, nell'evento che ti genera l'errore:
sub dgrdQuerySearch_ItemCommand(Sender As object, E As
DataGridCommandEventArgs)
if (e.CommandName="xPulsante") then
Testo.Text = e.Item.Cells(2).Text
...
end if
end sub
Ciao
--
AZ [Microsoft .NET MVP]

 Ciao
Grazie, funziona perfettamente. :-)
Io avevo risolto nel modo che allego, ma la tua soluzione e' molto piu'
pulita.
-----------------------------
sub dgrdQuerySearch_ItemCommand(Sender As object, E As
DataGridCommandEventArgs)
 Dim intCheckItemIndexValue as integer = e.item.ItemIndex
 Dim intProduttore, intDescrizione as integer
 if intCheckItemIndexValue = -1 then
  <%-- Se sono appena passato ad una pagina successiva, setto i valori a
0 --%>
  intProduttore = 0
  intDescrizione = 0
 else
  BindDataGrid()
  intProduttore = 2
  intDescrizione = 3
 end if
 Testo.Text = e.Item.Cells(intProduttore).Text
 Testo1.Text = e.Item.Cells(intDescrizione).Text
end sub
-----------------------------
Grazie ancora. :-)
Ciao,


 Marlenio
Prego! :)
Ciao!


 Marlenio
Prego! :)
Ciao!


 Marlenio
Prego! :)
Ciao!
