33 messaggi dal 29 settembre 2010
Ciao a tutti,
non riesco a riordinare correttamente da codice l'ordine delle colonne della mia gridview.
Ora il gridview è composto da due colonne contenten TemplateField inseriti a design e poi il resto delle colonne vengono caricate runtime in base ad una query e ad un databind.

Io vorrei che le due colonne TemplateField vengano posizionate dopo le colonne generate dal databind.
Ho provato a spostarle a design ma non penso sia possibile.

Ho poi provato con questo codice
Dim columnToMove = GridViewArchivioBuoni.Columns(1)
GridViewArchivioBuoni.Columns.RemoveAt(1)
GridViewArchivioBuoni.Columns.Insert(4, columnToMove)


solo che mi dice che l'indice non è compreso nell'intervallo.
in effetti provando a far contare le colonne il sistema dice che ce ne sono due anche se faccio girare il codice in un evento che avviene dopo il databind.

Spero di essermi spiegato senza aver fatto troppa confusione.

Grazie
33 messaggi dal 29 settembre 2010
Nessun suggerimento?
Grazie
308 messaggi dal 08 gennaio 2011
Ciao non so se hai pensato a farti restituire dalla query anche le colonne che altrimenti aggiungi a design time.

p. es. SELECT c1, c2, c3, ..... 0 as CI1, 'ciao' AS CI2

CI1 e CI2 sarebbero le colonne che non fanno parte della tabella sul DB.


Se poi vuoi modificare l'insieme Columns, dato che le due colonne devono stare alla fine, le aggiungerei semplicemente. Senza prima inserirle a designtime.

Ciao.
Modificato da marioformosa il 23 settembre 2012 10.38 -
33 messaggi dal 29 settembre 2010
Ciao,
scusa ma non credo di aver capito la tua proposta.
Il problema è che nelle colonne che voglio aggiungere ho una colonna di textbox e una colonna di bottoni.

Altrimenti dovrei poter inserire a run time queste colonne ma non ne sono capace....
308 messaggi dal 08 gennaio 2011
Scusami per la risposta precedente ma io credevo si trattasse di datagridview di windows form.

Tuttavia dopo aver fatto una prova in ambito webform, credo che potresti risolvere il tuo problema, ammesso che la query restituisca sempre le stesse colonne, semplicemente creando a design time la struttura del gridview inserendo prima tante colonne quante sono quelle restituite dalla query avvalorando per ognuna di esse la proprietà datafield col nome della colonna corrispondente restituita dalla query, e poi le due colonne che servono a te senza mettere nulla nella proprietà data field.

Se indichi a design time il datasource, fai attenzione a non confermare l'aggiornamento dei campi, altrimenti il grid view verrà reimpostato con lo schema dell'origine dati.

Se non indichi datasource a design time, puoi poi, magari nel gestore del load, scrivere una cosa del genere :

GridView1.DataSource = MyQueryResult
Page.DataBind()


Spero di esserti stato utile.

Ciao.
Modificato da marioformosa il 26 settembre 2012 07.39 -
33 messaggi dal 29 settembre 2010
Scusa ma non ci ho capito moltissimo...ti posto il mio codice che è molto semplice
Dim fileAccess As String = ConfigurationManager.ConnectionStrings("AccessConnectionString").ConnectionString
        Dim conAccess = New OleDb.OleDbConnection(fileAccess)
        Dim queryAccess As String = ("SELECT Id_richiesta, Data_richiesta, Richiedente, Testo_breve_materiale FROM Richieste_materiale ")
        Dim cmd As New OleDb.OleDbCommand(queryAccess, conAccess)
        conAccess.Open()
        GridViewArchivioBuoni.DataSource = cmd.ExecuteReader()
        GridViewArchivioBuoni.DataBind()
        Dim columnToMove = GridViewArchivioBuoni.Columns(1)
        GridViewArchivioBuoni.Columns.RemoveAt(1)
        GridViewArchivioBuoni.Columns.Insert(4, columnToMove)
        conAccess.Close()


Ed anche il codice del gridview è molto semplice:

<asp:GridView ID="GridViewArchivioBuoni" runat="server" 
        DataKeyNames="Id_richiesta">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:ButtonField ButtonType="Button" Text="Registra" />
        </Columns>
    </asp:GridView>


Solo che mi da errore "Indice di inserimento non compreso nell'intervallo"
308 messaggi dal 08 gennaio 2011
Ciao, scusami per la poca chiarezza  in pratica volevo dire col post precedente, che a design time imposti la gridview, facendo solo attenzione a non mappare ai campi restituiti dalla query quelli che appunto non lo devono essere.

Partendo dal tuo esempio, cancellerei delle ultime 4 righe del tuo codice VB le prime tre e ammesso che la gridview debba visualizzare ad esempio i campi Data_Richiesta e Richiedente, restituiti dalla query + altre due colonne alla fine, il codice ASP potrebbe essere :

 <asp:GridView ID="GridViewArchivioBuoni" runat="server" AutoGenerateColumns="False" 
            Width="296px">
            <Columns>
                <asp:BoundField DataField="Data_richiesta" />
                <asp:BoundField DataField="Richiedente" />
                <asp:ButtonField Text="Pulsante" />
                <asp:CommandField ShowEditButton="True" />
            </Columns>
        </asp:GridView>


Come puoi notare, le prime due colonne avvalorano DataField, che collegano le colonne alle corrispondenti restituite dalla query.

Prova un pò, a me sembra che vada tutto ok.

Ciao
Modificato da Mario Formosa il 03 ottobre 2012 18.40 -
93 messaggi dal 25 maggio 2005
l'inserimento delle colonne Bound direttamente in design nella griglia, credo sia la cosa migliore, poiché anche a me le griglie con colonne dinamiche non piacciono per nulla (questione di progettazione).

Se nel caso tuo hai proprio bisogno di colonne dinamiche, allora proverei questo:

List<DataControlField> coloumns = new List<DataControlField>();
foreach (DataControlField coloumn in gv.Columns)
{
coloumns.Add(coloumn);
}

//direttamente dentro il for, o in questo punto, prendi le colonne con i textbox e le sposti in fondo alla collection

gv.Columns.Clear();
foreach (DataControlField coloumn in coloumns)
{
gv.Columns.Add(coloumn);
}

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.