54 messaggi dal 13 settembre 2010
Ciao,
come da te suggerito alla fine ho risolto mettendo
ItemStyle-Width ="110px" HeaderStyle-Width="108px"

direttamente all'interno di ogni template field cosi' son sicuro che escono della stessa larghezza...

Ti ricordi il discorso che avevamo fatto qualche post fa relativamente al databinding nel Page_InitComplete??

Mi avevi consigliato di utilizzarlo ma mi sono accorto solo ora che ho un side effect:
la mia gridview pò essere popolata utilizzando dei filtri (dropdownlist) che vanno a selezionare dei campi per poi comporre la query.
Una volta popolata la mia gridview a fianco di ogni riga c'è un checkbox che mi permette di selezionare più record per poi eseguire varie operazioni sui check selezionati(stampa, confronti, ecc..).
Per recuperare il valore dell'id della riga corrispondente al checkbox faccio
for each row As GridViewRow in distinteGrid.Rows
  Dim _check As CheckBox = row.FindControl("selezionato")
    if _check.Checked
      codaStampeSource.InsertCommand="INSERT INTO coda_stampe (id_distinta) VALUES("+distinteGrid.DataKeys(row.RowIndex).Value.ToString+")"
      codaStampeSource.Insert
      almenouna=true
    end if
next


Ecco da quando ho spostato il databinding nell'initcomplete mi esce questo errore
Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index 

ma solo se filtro qualche dato attraverso le dropdownlist, se lascio la query senza filtri funziona tutto correttamente...

Non riesco a capire perchè..Ci capisci qualcosa tu??

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

gdalbell ha scritto:

la mia gridview pò essere popolata utilizzando dei filtri (dropdownlist) che vanno a selezionare dei campi per poi comporre la query.

uhm, quando applichi i filtri esattamente? Sii consapevole che, se lo fai nell'InitComplete, la DropDownList non avrà ancora recuperato il valore selezionato dai dati del POST. Non potrai leggere il suo valore dalla proprietà .SelectedValue ma dovrai ricorrere alla collezione Request.Form
Dim valoreSelezionato As String = Request.Form(ddlFiltro.UniqueID)


gdalbell ha scritto:

Index was out of range.

Per ora prova a disattivare il ViewState per la GridView.
<asp:GridView EnableViewState="false" runat="server">
</asp:GridView>


Se non dovesse funzionare comunque, prova ad arrivare all'id_distinta in altro modo. Anziché accedere alla collezione DataKeys, ricorda che GridViewRow ha una proprietà DataItem che rappresenta l'oggetto distinta corrente:
'qui cambia TuoTipoDistinta. Non so di che tipo sia il tuo oggetto distinta...
Dim item as TuoTipoDistinta = row.DataItem
'qui cambia campoIdDistinta con il nome del campo che contiene l'id
Dim id_distinta = item.campoIdDistinta
'id_distinta contiene il valore da usare nella INSERT
'occhio alla SQL injection, usa sempre i SqlParameters


ciao
Modificato da BrightSoul il 21 maggio 2012 23.24 -

Enjoy learning and just keep making
54 messaggi dal 13 settembre 2010
Ok ho messo
Dim valoreSelezionato As String = Request.Form(ddlFiltro.UniqueID)

e adesso quando faccio il sort (cliccando sull'header della gv) funziona correttamente recuperando il valore della dropdownlist.


Resta il problema
Index was out of range.

Se disattivo il viewstate non cambia nulla...
Ho provato ad utilizzare il dataitem ma devo dirti che la mia distinta non ha un tipo specifico, nel senso che una distinta e' semplicemente composta da una serie di gridview che rappresentano dei dati recuperati dal db...
Facendo cosi'
Dim item As Object = row.DataItem
Dim id_distinta As String = item.id

mi esce l'errore
Object variable or With block variable not set. 
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

gdalbell ha scritto:

la mia distinta non ha un tipo specifico, nel senso che una distinta e' semplicemente composta da una serie di gridview

ok, credo di aver usato il termine "distinta" in maniera incorretta per riferirmi al DataItem. Intendevo dire, "le righe"... di che tipo sono?

Mi spiego meglio: tu hai un oggetto che assegni al DataSource della GridView. Di che tipo è quest'oggetto? E' un DataTable o un DataSet? Se sì, "la riga" sarà di tipo DataRow, e quindi:
Dim item As DataRow = row.DataItem
Dim id_distinta As Integer = item("nomecampo_id_distinta")


Se comunque non riesci a capire subito di che tipo sia, usa il debugger di Visual Studio: metti un breakpoint in corrispondenza della prima delle due istruzioni e, quando l'esecuzione si ferma, poggia il mouse sopra DataItem. Dal tooltip che apparirà potrai leggere il tipo.

gdalbell ha scritto:

Resta il problema Index was out of range.

Giusto per non escludere nulla, ieri ho dimenticato di chiederti se (e come) hai impostato la proprietà DataKeyNames della GridView. Hai fatto così?
<asp:GridView DataKeyNames="NomeCampo" runat="server" ... />


gdalbell ha scritto:

Se disattivo il viewstate non cambia nulla...

ok, ma mantienilo disattivato se non noti problemi. Così la tua pagina non si appesantisce a causa del Viewstate.

ciao
Modificato da BrightSoul il 22 maggio 2012 20.54 -

Enjoy learning and just keep making
54 messaggi dal 13 settembre 2010
Ciao,
il DataSource della gridview è un SqlDataSource, la Select della quale vado a comporla da code behind attraverso diversi valori di SelectParameters.

Ho provato a mettere
Dim item As DataRow = row.DataItem
Dim id_distinta As Integer = item("id")

ma mi esce l'errore
Object reference not set to an instance of an object. 

Perchè? Non è giusto il tipo DataRow?
Sono senza pc di sviluppo per 10 giorni e non ho a disposizione visual studio...

Per quanto riguarda il DataKeyNames il codice è
<asp:GridView DataKeyNames="id" runat="server" ... />


Ciao e grazie
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
gdalbell ha scritto:

Perchè? Non è giusto il tipo DataRow?

No, scusa, ho sbagliato io. Il tipo esatto sarebbe DataViewRow ma dimenticavo che la proprietà DataItem la trovi valorizzata solo se la leggi in corrispondenza dell'evento RowDataBound della GridView. Lascia perdere questa strada; avevi scritto giusto tu.

gdalbell ha scritto:

Per quanto riguarda il DataKeyNames il codice è
<asp:GridView DataKeyNames="id" runat="server" ... />

sì, è corretto e andava bene anche il codice che avevi scritto per recuperare l'id della riga dalla collezione DataKeys:
codaStampeSource.InsertCommand="INSERT INTO coda_stampe (id_distinta) VALUES("+distinteGrid.DataKeys(row.RowIndex).Value.ToString+")"


Ora, vado un po' alla cieca perché non ho sottomano il codice ma, ragionandoci meglio, penso che il problema dell'Index out of range' dipenda dal fatto che le righe della GridView cambino da prima a dopo il postback. Puoi confermare questa cosa?
E' come se inizialmente, nella GridView, ci fossero ad esempio 10 righe e poi, dopo il Postback, ne diventassero di più.

gdalbell ha scritto:

la Select della quale vado a comporla da code behind attraverso diversi valori di SelectParameters.

Ecco, probabilmente è questa la causa per cui il SqlDataSource, dopo il postback, restituisce più righe del normale. Ricorda che all'InitComplete i controlli non hanno ancora ripristinato il loro stato e quindi nella Select verranno adoperati valori sbagliati. Come dicevo un paio di post fa, sei costretto a leggere i valori dalla collezione Request.Form anziché dalla proprietà .SelectedValue o .Text dei controlli.
Dunque, i SelectParameters del SqlDataSource non dovrebbero essere degli asp:ControlParameter, bensì degli asp:FormParameter.

Effettuare il binding nell'InitComplete ha generato non pochi effetti collaterali ma, con un po' di consapevolezza su quello che succede nella pagina, riuscirai a venirne fuori.
Uno dei problemi legati all'uso degli asp:FormParameter è che potresti non riuscire a beccare i nomi giusti per FormField. Esamina l'HTML della pagina e controlla con che attributo name vengono renderizzati i controlli usati per il filtraggio dei risultati. Quelli saranno i nomi da usare come FormField.

ciao
Modificato da BrightSoul il 30 maggio 2012 23.10 -

Enjoy learning and just keep making
54 messaggi dal 13 settembre 2010
Ciao,
ho fatto diverse prove ma niente.
Ti posto l'inizio del metodo carica che richiamo qui
Sub Page_InitComplete(objSender As Object, objArgs As EventArgs)
carica()
End Sub

e che uso per creare la select così vedi come faccio.
Sub carica()
  distinteSource.SelectParameters.Clear
  Dim sb As StringBuilder=new StringBuilder
  
  if not string.IsNullOrEmpty(Request.Form("search1"))
distinteSource.SelectParameters.Add("titolo", Request.Form("search1"))
  if sb.length=0
  sb.Append(" WHERE ")
  else
  sb.Append(" AND ")
  end if
  sb.Append("d.titolo LIKE '%' + @titolo+ '%'")
  end if

......
......

Poi qui ci sono altre eventuali aggiunte alla stringa sb (se l'utente filtra altri dati). Poi con la stringa composta vado a creare la query
distinteSource.SelectCommand = "SELECT ....+sb.ToString()+ order by..
distinteGrid.DataBind
End Sub


Al posto di
distinteSource.SelectParameters.Add("titolo", Request.Form("search1"))

ho provato a mettere il form parameter
  Dim formParam As New FormParameter("titolo","search1")
  formParam.Type=TypeCode.String
  distinteSource.SelectParameters.Add(formParam)


ma niente. Mi esce sempre lo stesso errore
Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index


Ultima precisazione che credo di aver già fatto: questo problema ce l'ho solo quando filtro dei campi (cioè quando la stringa sb contiene qualcosa) perchè se non filtro niente tutto funziona senza problemi.

Scusa l'insistenza ma continuo a vederci nero su questa cosa...
Grazie mille.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
prova ad impostare EnableViewState="false" sia sul SqlDataSource che sulla GridView.
Usare il FormParameter o il metodo .Add(nomeparametro, valore) non fa differenza.

Boh, a me sembra tutto corretto. In locale riesco a riprodurre il problema se, dopo il postback, il SelectCommand produce più righe perché magari la query è diversa.

A questo punto l'errore te lo può far scoprire solo il debugger. Metti dei punti di interruzione qui:
  • su distinteGrid.DataBind, così che puoi ispezionare il SelectCommand e tutti i vari Request.Form da cui provengono i valori per i parametri.
  • su codaStampeSource.InsertCommand=... così puoi vedere quali elementi contiene la collezione DataKeys e che valore ha row.RowIndex.


ciao
Modificato da BrightSoul il 02 giugno 2012 19.03 -

Enjoy learning and just keep making

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.