85 messaggi dal 04 marzo 2012
Salve,
dovrei rappresentare elencare in un gridview un elenco di oggetti che potrebbero essere inseriti o meno nella costruzione di un oggetto più complesso. Es.
Devo costruire una bicicletta per costruirla c'è un elenco di oggetti che possono far parte di essa o meno ruote di tipo A di tipo B e di tipo C, Manubrio di tipo A di tipo B e di tipo C, ecc.
Nella GridView vorrei vedere tutti gli oggetti disponibili con in fianco un flag dove posso selezionare quelli che interessano, e fin qui non è un problema, vedi sotto:

<asp:GridView ID="dgvOggetti" runat="server" AutoGenerateColumns="False"
DataSourceID="SqlDataOggetti">
<Columns>
<asp:BoundField DataField="IDOggetto" HeaderText="IDOggetto"
InsertVisible="False" ReadOnly="True" SortExpression="IDOggetto" />
<asp:BoundField DataField="Codice" HeaderText="Codice"
SortExpression="Codice" />
<asp:BoundField DataField="Descrizione" HeaderText="Descrizione"
SortExpression="Descrizione" />
<asp:TemplateField>
<itemtemplate>
<asp:checkbox ID="cbSelect"
CssClass="gridCB" runat="server"></asp:checkbox>
</itemtemplate>

</asp:TemplateField>
</Columns>
<editrowstyle BackColor="#999999"></editrowstyle>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataOggetti" runat="server"
ConnectionString="<%$ ConnectionStrings:HTS_GestioneConnectionString %>"
SelectCommand="SELECT [IDOggetto], [Codice], [Descrizione] FROM [C_Oggetti] ORDER BY [Codice]">
</asp:SqlDataSource>

Il problema è quando devo richiamare la bicicletta vorrei visualizzare comunque l'elenco completo di oggetti sia quelli selezionati che non con e i relativi flag di presente, sottolineo che ho pensato di memorizzare i record selezionati in una tabella a parte.
Per tanto ho tre tabelle da gestire ( 1- tabella contenente anagrafica bicicletta, 2 - elenco di oggetti disponibili, 3 - elenco di oggetti selezionati per la bicicletta x).
Come posso fare, grazie.
Modificato da fughy il 11 giugno 2018 15.14 -
256 messaggi dal 30 novembre 2004
Crea una classe dove instanzi un nuovo oggetto con i campi ad hoc ad esempio
NomeProdotto;
Descrizione;
Prezzo;
isChecked;

Poi crei una list di questo oggetto e la riempi con i valori che desideri e la usi come datasource
Modificato da mexico77 il 12 giugno 2018 08.56 -
85 messaggi dal 04 marzo 2012
Riusciresti a farmi un breve esempio per cortesia?
Grazie
256 messaggi dal 30 novembre 2004
Instanzi una nuova lista
List<TuoOggetto> lista= new List<TuoOggetto>();

Crei un oggetto nuovo
Qui cicli i risultati da aggiungere
TuoOggetto _TuoOggetto = new TuoOggetto();
_TuoOggetto.propieta = valore
lista.Add(oggetto)


alla fine del ciclo quello che dai come data source è: lista
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
penso che la classe si possa anche non creare. Infatti, dato che stai usando SqDataSource, puoi semplicemente modificare la query in modo che integri anche la colonna che ti dice se la flag è presente o no.


tutti gli oggetti disponibili con in fianco un flag dove posso selezionare quelli che interessano, e fin qui non è un problema

Ok, sono sicuro che hai dato all'utente la possibilità di salvare queste spunte. Cosa fai per salvare le spunte? Immagino che tu faccia delle INSERT in una tabella secondaria che è relazionata a [C_Oggetti]. Quindi devi modificare la tua query in modo che ci sia una JOIN tra [C_Oggetti] e questa tabella secondaria che supponiamo si chiami [C_Spunte].

Questa è un'ipotesi di come andrà modificata la query del SqlDataSource. Vedi appunto la JOIN tra le due tabelle.
<asp:SqlDataSource ID="SqlDataOggetti" runat="server" 
ConnectionString="<%$ ConnectionStrings:HTS_GestioneConnectionString %>" 
SelectCommand="SELECT [C_Oggetti].[IDOggetto], [C_Oggetti].[Codice], [C_Oggetti].[Descrizione], [C_Spunte].[Spunta] FROM [C_Oggetti] LEFT JOIN [C_Spunte] ON [C_Oggetti].[IDOggetto] = [C_Spunte].[IDOggetto] ORDER BY [C_Oggetti].[Codice]">
</asp:SqlDataSource>


Probabilmente nella clausola ON dovrai anche filtrare per l'id della bicicletta da costruire. Se ci mostri le INSERT che fai nella tabella [C_Spunte] sarebbe incredibilmente di aiuto. Senza conoscere nomi di campi e tabelle è impossibile dare consigli precisi.

ciao,
Moreno
Modificato da BrightSoul il 12 giugno 2018 14.15 -

Enjoy learning and just keep making
85 messaggi dal 04 marzo 2012
Ho provato a farla così che sembra funzioni, ma a questo punto dovrei filtrare con un where i record relativi un un determinato record della tabella C_ForniCategorie, da tenere presente che sulla tabella C_Oggetti non c'è un legame con quella precedente.
Un secondo problema che per adesso la colonna "SEL" è di sola visualizzazione ma dovrei sostituirla con una check box modificabile, immagino che devo operare da vb, corretto? mi potete fare qualche esempio, grazie.

<asp:View ID="View2" runat="server">
<asp:GridView ID="dgvOggetti" runat="server" AutoGenerateColumns="False"
DataSourceID="SqlDataOggetti">
<Columns>
<asp:BoundField DataField="IDOggetto" HeaderText="IDOggetto"
InsertVisible="False" ReadOnly="True" SortExpression="IDOggetto" />
<asp:BoundField DataField="Codice" HeaderText="Codice"
SortExpression="Codice" />
<asp:BoundField DataField="Descrizione" HeaderText="Descrizione"
SortExpression="Descrizione" />
<asp:BoundField DataField="Sel" HeaderText="Sel" SortExpression="Sel" />
</Columns>
<editrowstyle BackColor="#999999"></editrowstyle>
</asp:GridView>


<asp:SqlDataSource ID="SqlDataOggetti" runat="server"
ConnectionString="<%$ ConnectionStrings:HTS_GestioneConnectionString %>"

SelectCommand="SELECT C_Oggetti.IDOggetto, C_Oggetti.Codice, C_Oggetti.Descrizione, C_ForniOggetti.Sel FROM C_ForniCategorie INNER JOIN C_ForniOggetti ON C_ForniCategorie.IDForno = C_ForniOggetti.IDForno RIGHT OUTER JOIN C_Oggetti ON C_ForniOggetti.IDOggetto = C_Oggetti.IDOggetto ORDER BY C_ForniCategorie.Codice">
</asp:SqlDataSource>
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
per il primo problema: ok, puoi aggiungere una WHERE alla tua query SQL. Il SqlDataSource supporta i parametri quindi dovrai semplicemente valorizzare il parametro con il valore da usare nella WHERE.

Ecco un esempio minimale, dovrai adattarlo al tuo caso. Ovviamente al posto della mia query SQL dovrai mettere quella che hai postato, integrandola con la WHERE.
<asp:sqlDataSource ID="SqlDataSource1" 
  SelectCommand="SELECT campo1, campo2 FROM tabella WHERE campo3 = @Parametro"
  ConnectionString="<%$ ConnectionStrings:MiaConnection %>"
  OnSelecting="ImpostaValoreParametro"
  RunAt="server">

  <SelectParameters>
    <asp:Parameter Name="Parametro" Type="Int32" DefaultValue="0" />
  </SelectParameters>
</asp:sqlDataSource>


Come vedi qui, ho anche gestito l'evento OnSelecting del SqlDataSource e lo sfrutto per valorizzare il parametro subito prima che la query SQL venga inviata al database. Per esempio, il valore da assegnare al parametro potrebbe arrivare dalla querystring o da altra fonte, lo devi sapere tu. Da dove ottieni il valore che usi per filtrare C_ForniCategorie?

Ed ecco la funzione ImpostaValoreParametro che gestisce l'evento OnSelecting.
protected void ImpostaValoreParametro(object sender, SqlDataSourceSelectingEventArgs e)
{
  //Supponiamo che il valore arrivi dalla querystring
  (sender as SqlDataSource).SelectParameters["Parametro"].DefaultValue = Request.Querystring["Parametro"];
}


Per il secondo problema, anziché usare un BoundField potresti usare un CheckBoxField come vedi qui:
https://www.aspsnippets.com/Articles/How-to-use-and-get-value-of-CheckBoxField-in-GridView-with-example-in-ASPNet.aspx

ciao,
Moreno
Modificato da BrightSoul il 14 giugno 2018 20.11 -

Enjoy learning and just keep making
85 messaggi dal 04 marzo 2012
Grazie per le dritte, ho risolto come indicato sotto, utilizzando una select con una Union e con un NOT IN:

SELECT '" & txtCodice.Text & "', C_Oggetti.IDOggetto, C_Oggetti.Codice, C_Oggetti.Descrizione, C_ForniOggetti.Sel, C_ForniOggetti.Sel as isselected FROM C_ForniCategorie Inner Join C_ForniOggetti ON C_ForniCategorie.IDForno = C_ForniOggetti.IDForno RIGHT OUTER JOIN C_Oggetti ON C_ForniOggetti.IDOggetto = C_Oggetti.IDOggetto where C_ForniCategorie.codice = '" & txtCodice.Text & "' " & _
"Union " & _
"SELECT '" & txtCodice.Text & "', C_Oggetti.IDOggetto, C_Oggetti.Codice, C_Oggetti.Descrizione, 0, 0 as isselected FROM C_Oggetti where codice NOT IN (Select Codice FROM C_ForniOggetti WHERE C_ForniOggetti.IDOggetto = C_Oggetti.IDOggetto AND IDForno = " & Me.dgvForni.SelectedValue & ") ORDER BY C_Oggetti.Codice"

Mentre per quanto riguarda il problema della checkBox ho inserito nella gridview la checkbox eseguendo una conversione dei valori.

<asp:TemplateField HeaderText="Associato"><ItemTemplate><asp:CheckBox ID="cbCheckBox" runat="server" checked='<%# Convert.ToBoolean(Eval("Sel")) %>'/></ItemTemplate></asp:TemplateField>

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.