85 messaggi dal 04 marzo 2012
Salve,
ho la necessità di creare una gridview da codice, e riempirla con determinati dati.
per far cioè ho pensato di fare come segue, il mio problema però è che devo aggiungere anche una colonna che deve essere una dropdownlist e riempirla con il contenuto di una tabella, e qui mi blocco.
Immagino che devo inserire un colonna di tipo templatecolumn e dentro il dropdown, ma non so come si fa, mi potete fare un esempio per cortesia.
Ringrazio anticipatamente.

column = New DataColumn()
column.DataType = System.Type.GetType("System.String")
column.ColumnName = "Codice"
column.ReadOnly = True
column.Unique = False
table.Columns.Add(column)

column = New DataColumn()
column.DataType = System.Type.GetType("System.String")
column.ColumnName = "Descrizione"
column.ReadOnly = True
column.Unique = False
table.Columns.Add(column)

For i = 0 To objDataSetOggettiTipo.Tables(0).Rows.Count - 1

row = table.NewRow()
row("Codice") = objDataSetOggettiTipo.Tables(0).Rows(i).Item("Codice")
row("Descrizione") = objDataSetOggettiTipo.Tables(0).Rows(i).Item("Descrizione")
table.Rows.Add(row)

Next
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


Immagino che devo inserire un colonna di tipo templatecolumn e dentro il dropdown, ma non so come si fa, mi potete fare un esempio per cortesia.

Sì, quello che puoi fare in maniera dichiarativa con il markup lo puoi fare anche da codice C# o VB.NET.

Supponiamo di voler creare una dropdownlist per i generi (maschile o femminile).

//Colonna con menu a tendina
var gender = new TemplateField();

//Il TemplateField vuole che si valorizzino i suoi template.
//Secondo tua necessità, popola l'ItemTemplate, L'EditItemTemplate e così via
//Io popolo l'ItemTemplate con una label, per offrire il valore in sola lettura
//e l'EditItemTemplate con la DropDownList per offrire la possibilità di modifica.

//ItemTemplate
gender.ItemTemplate = new ControlTemplate(() =>
{
    return new Label();
});

//EditItemTemplate
gender.EditItemTemplate = new ControlTemplate(() => {
    var dropDownList = new DropDownList
    {
        DataTextField = "GenderName",
        DataValueField = "GenderId"
    };
    //La dropdownlist ha un proprio data source
    dropDownList.DataSource = GetDataSourceForGender();
    return dropDownList;
});

//Aggiungo la colonna
gridView.Columns.Add(gender);


Ti servirà anche questa classe ControlTemplate che serve da contenitore alla dropdownlist (o a qualsiasi altro controllo tu voglia usare).
public class ControlTemplate : ITemplate
{
    private readonly Func<Control> controlFactory;
    public ControlTemplate(Func<Control> controlFactory)
    {
        this.controlFactory = controlFactory;
    }
    public void InstantiateIn(Control container)
    {
        container.Controls.Add(controlFactory());
    }
}


...e questo era il metodo che fornisce il datasource alla dropdownlist. E' solo un esempio. Nel tuo caso i valori arriveranno dal database.
private DataTable GetDataSourceForGender()
{
    //Questo è un datatable generato a mano ma il suo contenuto
    //può ovviamente essere ottenuto dal database
    var genders = new DataTable();

    //Schema
    genders.Columns.Add("GenderId", typeof(int));
    genders.Columns.Add("GenderName", typeof(string));

    //Data
    genders.Rows.Add(1, "F");
    genders.Rows.Add(2, "M");

    return genders;
}



Il codice che hai postato credo che non c'entri, perché vedo che stai creando un DataTable e copiandoci dentro gli stessi dati di un altro DataTable. Puoi spiegare qual è il suo utilizzo?

ciao,
Moreno

Enjoy learning and just keep making
85 messaggi dal 04 marzo 2012
Ciao Moreno,
innanzitutto grazie per la risposta, scusa se rispondo solo ora ma ho fatto qualche giorno di vacanza.
Perchè uso un altro datatable anzichè direttamente la datagridview "non lo so" ho imparato così e sicuramente non è il metodo più corretto se mi puoi dare qualche dritta anche su questo fronte te ne sarei grato, ora opero così: creo un datagridview vuoto e poi lo riempio a codice come segue:

table = New DataTable
Dim column As DataColumn
Dim row As DataRow

'Creo le colonne
column = New DataColumn()
column.DataType = System.Type.GetType("System.Double")
column.ColumnName = "IDOggettotipo"
column.ReadOnly = True
column.Unique = False
table.Columns.Add(column)

column = New DataColumn()
column.DataType = System.Type.GetType("System.String")
column.ColumnName = "Codice"
column.ReadOnly = True
column.Unique = False
table.Columns.Add(column)

'Aggiungo i record
row = table.NewRow()
row("IDOggettoTipo") = 1
row("Codice") = "Prova"
table.Rows.Add(row)

'Al termine riempio DGV

Me.dgvOggettiObbligatori.DataSource = table

§§§§§§§§§§

Stavo seguendo il tuo esempio ma mi serve qualche dritta, ho tradotto in vb la seguente parte (uso per ora ancora il datatable di comodo se on è un problema e uso solo un campo di tipo edit)

Dim gender = New TemplateField()
'EditItemTemplate
gender.EditItemTemplate = New ControlTemplate()
Dim dropDownList = New DropDownList
dropDownList.DataTextField = "GenderName",
dropDownList.DataValueField = "GenderId"

'La dropdownlist ha un proprio data source
DropDownList.DataSource = GetDataSourceForGender()

'Aggiungo la colonna, ma qua mi da già un errore in quanto il tipo di colonna è diversa, ma se mi dici come creare le altre colonne (vedi sopra) il problema lo arginiamo
table.Columns.Add(gender)
e lo risolvo cosi: Me.dgvOggettiObbligatori.Columns.Add(gender)

Funzione per recupero dei dati (per ora uso dati fissi di esempio)

Private Function GetDataSourceForGender() As DataTable
Dim genders = New DataTable()

'Schema
genders.Columns.Add("GenderId", Type.GetType("System.Integer"))
genders.Columns.Add("GenderName", Type.GetType("System.String"))

'Data
genders.Rows.Add(1, "F")
genders.Rows.Add(2, "M")

Return genders

End Function

La cosa che mi manca è la classe che tu mi hai indicato, ma qua sono in difficoltà fin'ora ho generato delle classi che richiamandole mi ritornavano indietro dei valori, ma non fatte così.
Mi potresti per cortesia darmi qualche dritta in più, come e dove scriverla e come richiamarla (se riesci in VB).
Ti ringrazio.
Luigi
Modificato da fughy il 22 agosto 2017 15.45 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Luigi,


Perchè uso un altro datatable anzichè direttamente la datagridview "non lo so"


Il DataTable è l'oggetto in cui sono contenuti i dati e, fintanto che stiamo facendo delle prove, va bene crearlo a mano come stai facendo tu. A questo punto, quando il DataTable è pronto, lo puoi usare come sorgente dati per una GridView. Questo è corretto ed è ciò che si fa normalmente.

Quello che non capivo era un'altra cosa: un secondo DataTable su cui stavi riversando i dati del primo. Questa cosa non è necessaria perché ti basta 1 solo DataTable e 1 solo GridView. Il DataTable è un contenitore di dati, il secondo decide come visualizzarli.

Guardando il codice di questo tuo ultimo post io penso di aver frainteso la tua domanda iniziale:

ho la necessità di creare una gridview da codice, e riempirla con determinati dati.


La richiesta di voler "creare una gridview da codice" probabilmente mi ha mandato fuori strada. Facciamo una cosa: ignora la mia prima risposta. Crea un nuovo progetto VB.NET e mettici dentro il DataTable e la GridView come stavi facendo all'inizio. Poi condividimelo su OneDrive, Google Drive o Dropbox e fammi sapere qual è il comportamento che intendi ottenere.

ciao,
Moreno
Modificato da BrightSoul il 23 agosto 2017 07.51 -

Enjoy learning and just keep making
85 messaggi dal 04 marzo 2012
Ciao Moreno,
ecco il link di Google drive https://drive.google.com/open?id=0B4gOnyCsWYloeGZILTUzRlhYcHM

La pagina interessata è "configuratore", se vedi nella view2 nella tab "Oggetti Obbligatori" ho creato una gridview vuota e poi la riempio con la sub CaricaOggettiObbligatori() nel relativo codice vb.

L'obbiettivo è il seguente: nella gridview devo caricare alcuni record prelevati da una tabella (ID, codice, descrizione) e fin qui come l'ho impostato dovrebbe funzionare.
In più vorrei aggiungerci per ogni record un campo dropdownlist dove ho la possibilità di selezionare il valore desiderato che proviene da un altra tabella che però possibilmente dovrebbe essere filtrato e cioè ad ogni ID della prima tabella corrispondono uno o più record di una seconda tabella (es. testata / dettaglio) è sotto inteso che sulla seconda tabella ho il riferimento alla prima.
es.
id = 1 Cod = CT Desc = Prova Drop = ogg1 / ogg2 / ogg3
id = 2 Cod = BT Desc = Prova2 Drop = ogg4 / ogg5 / ogg6

Ringrazio
Luigi
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Luigi,
non sono riuscito a far funzionare il tuo esempio perché mi manca il database. Comunque, ho preparato un nuovo progetto che contiene giusto una GridView con il suo BoundField e la DropDownList.

Nel codefile, puoi vedere come vengono caricate le opzioni nella DropDownList.

Ecco qua, guarda in particolare il metodo Griglia_RowDataBound che gestisce l'evento RowDataBound della GridView. Le opzioni vengono restituite da un metodo chiamato OttieniOpzioni che prende come argomento l'id della riga, in modo che tu possa usarlo in una query al database.

https://1drv.ms/u/s!Ao4rhSdtDw8rgelIAOYSmq1kGfURkg

ciao,
Moreno

Enjoy learning and just keep making
85 messaggi dal 04 marzo 2012
Ciao Moreno,
ti ringrazio per le dritte, ho provato a seguire il tuo esempio ma mi sa che sbaglio qualche cosa, perché la dorpdowlist sembra non caricare i dati, o meglio guardando con il debug sembra che effettivamente il programma passi di da "OttieniOpzioni" e carica correttamente i dati prelevati dalla tabella, ma non me li fa vedere, non riesco a capire dove sbaglio.
ti riporto parte del codice.

<asp:GridView ID="dgvOggettiObbligatori" runat="server"
AllowSorting="True" AutoGenerateColumns="False"
CssClass="TexBoxNumericoDx">
<Columns>
<asp:BoundField DataField="IDOggettoTipo" HeaderText="IDOggettoTipo"
SortExpression="IDOggettoTipo" />
<asp:BoundField DataField="Codice" HeaderText="Codice"
SortExpression="Codice" />
<asp:BoundField DataField="Descrizione" HeaderText="Descrizione"
SortExpression="Descrizione" />
<asp:TemplateField>
<ItemTemplate>
<asp:DropDownList ID="IDOggetto" runat="server">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Prezzo" HeaderText="Prezzo"
SortExpression="Prezzo" />
</Columns>
</asp:GridView>


table = New DataTable
table.Columns.Add("IDOggettotipo", GetType(Integer))
table.Columns.Add("Codice", GetType(String))
table.Columns.Add("Descrizione", GetType(String))
table.Columns.Add("IDOggetto", GetType(Integer))
table.Columns.Add("Prezzo", GetType(Double))
For i = 0 To objDataSetOggettiTipo.Tables(0).Rows.Count - 1
table.Rows.Add(objDataSetOggettiTipo.Tables(0).Rows(i).Item("IDOggettoTipo"), objDataSetOggettiTipo.Tables(0).Rows(i).Item("Codice"), objDataSetOggettiTipo.Tables(0).Rows(i).Item("Descrizione"), 1, 0)
Next



Protected Sub dgvOggettiObbligatori_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles dgvOggettiObbligatori.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim ddl = CType(e.Row.FindControl("IDOggetto"), DropDownList)
Dim opzioni = OttieniOpzioni(e.Row.DataItem("IDOggettotipo"))
ddl = New DropDownList
ddl.DataSource = opzioni
ddl.DataTextField = "DescrizioneOggetto"
ddl.DataValueField = "IDOggetto"
ddl.DataBind()
ddl.SelectedValue = e.Row.DataItem("IDOggetto")

End If
End Sub


Private Function OttieniOpzioni(id As Integer) As List(Of Genere)
Dim objDataAdapterOggetti As SqlDataAdapter
Dim objDataSetOggetti As DataSet
Dim objConnection As New SqlConnection()
Dim listaOpzioni As New List(Of Genere)

objConnection = New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("HTS_GestioneConnectionString").ToString())
objConnection.Open()

Try

objDataAdapterOggetti = New SqlDataAdapter()
objDataAdapterOggetti.SelectCommand = New SqlCommand()
objDataAdapterOggetti.SelectCommand.Connection = objConnection
objDataAdapterOggetti.SelectCommand.CommandText = "SELECT * FROM VW_C_Oggetti WHERE IDOggettoTipo = " & id & " AND Obbligatorio = 1 AND Disattivo = 0 ORDER BY Descrizione"

objDataSetOggetti = New DataSet()
objDataAdapterOggetti.Fill(objDataSetOggetti, "Oggetti")

If objDataSetOggetti.Tables(0).Rows.Count > 0 Then
For i = 0 To objDataSetOggetti.Tables(0).Rows.Count - 1
listaOpzioni.Add(New Genere With {.DescrizioneOggetto = objDataSetOggetti.Tables(0).Rows(i).Item("Descrizione"), .IDOggetto = objDataSetOggetti.Tables(0).Rows(i).Item("IDOggetto")})
Next
End If

Catch ex As Exception
ClsFileLog.ScriviLog(ex.Message, HttpContext.Current.Session("User"))
End Try

objDataAdapterOggetti = Nothing
objDataSetOggetti = Nothing
objConnection.Close()

Return listaOpzioni

End Function


Public Class Genere

Private Descrizione As String
Public Property DescrizioneOggetto() As String
Get
Return Descrizione
End Get
Set(ByVal value As String)
Descrizione = value
End Set
End Property


Private Id As String
Public Property IDOggetto() As String
Get
Return Id
End Get
Set(ByVal value As String)
Id = value
End Set
End Property

End Class
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,


ddl = New DropDownList

Commenta questa riga. Perché stai creando una nuova DropDownList?

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.