32 messaggi dal 09 febbraio 2009
Index non compreso nell'intervallo. Richiesto valore non negativo e minore della dimensione dell'insieme.
Nome parametro: index

Dim id_categoria As Integer = GridView1.DataKeys(e.RowIndex).Values("id")
Dim valoreStringa As String = DirectCast(GridView1.Rows(e.RowIndex).Cells(1).Controls(0), TextBox).Text
Dim cmdUpd As New SqlCommand("Upd_Categoria", CnConn)

su questa riga in grassetto ho l'errore come posso risolverlo????
Grazie
Il runtime ti sta dicendo che stai accedendo ad un item di una collection utilizzando
- o un indice negativo
- o un indice maggiore del numero di elementi della collection

Sicuramente un buon approccio per risolverlo sarebbe andare in debug e capire qual è l'indice errato.

Uno migliore, poi, è utilizzare il metodo FindControl così che tu possa svincolarti dalla struttura del template e ricercare la textbox di cui hai bisogno tramite il nome:
Dim txtBox As TextBox = DirectCast(e.Row.FindControl("myTextBox"), TextBox)
Dim valoreStringa As String;
If Not txtBox is Nothing Then
valoreStringa = txtBox.Text
Ciao,
m.
32 messaggi dal 09 febbraio 2009
il problemache in debug l'indice mi risulta -1 e qeusto che non riescoa capire
perchè nel gridview in modalità edit mi restituisce -1 quando seleziono il pulsante aggiorna ti posto tutto il codice della funzione
Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating

Dim id_categoria As Integer = GridView1.DataKeys(e.RowIndex).Values("id")
Dim valoreStringa As String = DirectCast(GridView1.Rows(e.RowIndex).Cells(1).Controls(0), TextBox).Text
Dim cmdUpd As New SqlCommand("Upd_Categoria", CnConn)

cmdUpd.CommandType = Data.CommandType.StoredProcedure
cmdUpd.Parameters.Add("@id_Categoria", Data.SqlDbType.Int, 10).Value = id_categoria
cmdUpd.Parameters.Add("@Descrizione", Data.SqlDbType.VarChar, 50).Value = valoreStringa

Try
CnConn.Open()
cmdUpd.ExecuteNonQuery()
CnConn.Close()
GridView1.EditIndex = -1
RicaricaGrid()

Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical = MsgBoxStyle.Critical, "Attenzione")
Finally
If (CnConn.State = Data.ConnectionState.Connecting) Then CnConn.Close()
End Try
End Sub
End Class
Scusa, ma se e.RowIndex fosse -1 otterresti l'errore anche sulla prima istruzione, no?

In secondo luogo, perchè non utilizzi e.NewValues per recuperare il nuovo valore?

m.
32 messaggi dal 09 febbraio 2009
no la prima istruzione prende il valore della cella tramite il datakeysname impostato a gridview, il socndo caso dovrebbe prendere il valore della textbox della riga dove corrisponde il pulsante aggiorna dove trova il controllo txtbox
Modificato da wolverine_ il 12 maggio 2009 19.05 -
No, scusa... non ti seguo
1) Dici che e.RowIndex = -1, ma se così fosse il primo statement dovrebbe sollevare un errore, quindi immagino che non lo sia. Giusto?
2) Ti ho consigliato di usare il metodo FindControl per recuperare la textbox. Quindi un bel
GridView1.Rows(e.RowIndex).FindControl("nomeTextbox")
piuttosto che andar giù dentro nella collection di Cells come hai fatto tu. In questo modo ti funziona? Se no, perchè?
3) Inoltre, ti ho detto che il sistema più facile per recuperare quel dato è utilizzare e.NewValues. Come mai non usi questo sistema?

Ciao,
m.
32 messaggi dal 09 febbraio 2009
1. Allora la prima istruzione non va in errore è questo è sicuro.
2. il metodo che mi hai consigliato non lo posso utilizzare poichè la tex non è fissa nella appplicazione quindi non posso utilizzare il metodo e anche se lo utilizzo l'errore e lo stesso
ti posto anche la parte html del gridview ti potrebbe essere di aiuto

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
CellPadding="4" Width="50%" DataKeyNames ="id,descrizione" EnableViewState="False" PageIndex="10" OnRowEditing ="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating"
OnPageIndexChanging="GridView1_PageIndexChanging" CellSpacing="2"
ForeColor="#333333" GridLines="None" HorizontalAlign="Justify">
<RowStyle BackColor="#EFF3FB"/>
<Columns>
<asp:BoundField DataField="id" HeaderText="id" ReadOnly="True"/>
<asp:BoundField DataField="descrizione" HeaderText="Categoria"/>
<asp:ButtonField ButtonType="Image" DataTextField="id" CommandName="Delete"
ImageUrl="~/images/registration1_(delete)_16x16.gif"
HeaderImageUrl="~/images/registration1_(delete)_16x16.gif"/>
<asp:ButtonField ButtonType="Image" DataTextField="id" CommandName="Edit"
ImageUrl="~/images/registration1_(edit)_16x16.gif"
HeaderImageUrl="~/images/registration1_(edit)_16x16.gif"/>
<asp:ButtonField ButtonType="Image" DataTextField="id" CommandName="Update"
HeaderImageUrl="~/images/registration1_(add)_16x16.gif"
ImageUrl="~/images/registration1_(add)_16x16.gif"/>
<asp:ButtonField ButtonType="Image" DataTextField="id" CommandName="Cancel"
HeaderImageUrl="~/images/redo1_16x16.gif"
ImageUrl="~/images/redo1_16x16.gif"/>
</Columns>
per utilizzare il metodo proposto da marco è sufficiente convertire le varie BoundField in TemplateField.

il visual studio può farlo in automatico per te.

dopodiche puoi utilizzare FindControl tranquillamente, nella riga (Container) ogni controllo è univoco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.