7 messaggi dal 28 gennaio 2021
Ciao a tutti. Mi trovo in difficoltà e chiedo aiuto per una situazione trattata spesso, ma separatamente e cioè: DDL create dinamicamente in GridView e evento esterno al GV che ne prende il value e/o il Text ... x memorizzare nel DB.
Sono alle prime esperienze ed il codice che riporto, spesso deriva da altro trovato in rete.
**************************************************************************************************************
In una WebForm ho disegnato un panel con all'interno una GridView. Esterno al panel c'è un Button.
La GridView è costituita da 2 BoundField (di cui il primo not visible).
Nel Load della pagina:
1. "assumo" 2 variabili DateTime che mi serviranno x aggiungere le DropDownList
2. "popolo" il DataTable mysql oCombo che mi servirà x le combo
3. if (!this.IsPostBack) {
... "popolo" il DataTable oDataTable_2 filtrando la mia tabella x credenziali e intervallo di date
... ciclo questo DT x generare i TemplateField. Questo il codice:
for (int k = 2; k < oDataTable_2.Columns.Count; k++) //aggiungo le colonne dei giorni dalla terza colonna
{
TemplateField tfield = new TemplateField();
tfield = new TemplateField();
tfield.HeaderText = oDataTable_2.Columns[k].ColumnName;
tfield.ItemStyle.Width = 55;
GridView2.Columns.Add(tfield);
}

... faccio il DataBind
}

4. Questo il codice:
protected void GridView_RowDataBound(Object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string NomeGiorno = "";
for (int k = 2; k < oDataTable_2.Columns.Count; k++)
{
NomeGiorno = oDataTable_2.Columns[k].ColumnName.ToString();
DropDownList ddlCombo = new DropDownList();
ddlCombo.ID = NomeGiorno;
ddlCombo.DataSource = oCombo;
ddlCombo.DataTextField = oCombo.Columns[0].ColumnName;
ddlCombo.DataValueField = oCombo.Columns[0].ColumnName;
ddlCombo.DataBind();
string country = (e.Row.DataItem as DataRowView).Row[NomeGiorno].ToString();
ddlCombo.Width = 55;
ddlCombo.Font.Name = "Arial";
ddlCombo.Font.Size = 8;
ddlCombo.Items.FindByText(country).Selected = true;
e.Row.Cells[k].Controls.Add(ddlCombo);
}
}
GridView2.Columns[1].HeaderStyle.CssClass = "locked";
}

Fin qui tutto ok (o per lo meno esteriormente). Uso le DDL, combiando item ... tutto OK !

Alla fine della fiera però voglio memorizzare le nuova situazione nel DB e così dovrò costruire
la query di update ciclando le colonne del GridView (che ha una sola row)
Ma non trovo il controllo !!

Ho provato questo codice ...

protected void ButtonOK_Click(object sender, EventArgs e)
{
string cStringa = "update pianificazione set ";
string NomeGiorno = "";
for (int k = 2; k < GridView2.Columns.Count; k++) //ciclo le colonne dei giorni dalla terza colonna
{ // cioè dopo codice fiscale, cognome e nome .
NomeGiorno = GridView2.Columns[k].ToString();
string prova = ((DropDownList)GridView2.Rows[0].FindControl(NomeGiorno)).SelectedItem.Text;
.....
.....
}

ottengo l'errore classico:

System.NullReferenceException: 'Riferimento a un oggetto non impostato su un'istanza di oggetto.'

Grazie a tutti coloro x potranno darmi una mano
Alessio
256 messaggi dal 30 novembre 2004
Allora ti suggerisco di crearti un oggetto che è composto dai campi della row della tua grid poi crei una lista di questi oggetti e la passi come datasource. Così dopo puoi fare il cast della row nel tuo oggetto e sarà più facile memorizzarlo
7 messaggi dal 28 gennaio 2021
mexico77 ha scritto:
Allora ti suggerisco di crearti un oggetto che è composto dai campi della row della tua grid poi crei una lista di questi oggetti e la passi come datasource. Così dopo puoi fare il cast della row nel tuo oggetto e sarà più facile memorizzarlo


Ciao Mexico, grazie x la disponibilità innanzitutto.
Sicuramente, per la mia scarsa preparazione, non ho ben chiaro il tuo suggerimento, quindi provo a "tradurlo x me".
Quando scrivevo al punto 3 --> faccio il Binding, in pratica eseguo questo codice:
GridView2.DataSource = oDataTable_2;
GridView2.DataBind();

Quindi l'oggetto iniziale ce l'ho, il problema che quando cambio qualche valore di una qualsiasi delle combo (fai conto che siano 31 ma potrei, da codice, averne 7 o 60 .. o più), questo stesso valore devo riportarlo nel database.

Dalle mie innumerevoli prove in debug ho visto che la prima istruzione che esegue il ButtonOK_Click quello di ripassare dal Load e poi entra nell'evento .
Poi ho visto che se faccio un controllo immediato della istruzione:
GridView2.Rows[0].Cells[k].text .... dove k è 0 oppure 1 ottengo il Codice fiscale e nominativo .... come da DataTable
con k > 1 (ddl) ottengo &nbsp
neanche l'istruzione ((DropDownList)GridView2.Rows[0].FindControl(NomeGiorno)).SelectedItem.Text;
se provo un GetType non ottengo un DDL , come se non esistessero più le DDL nella Grid !
Ho anche pensato che sia colpa di ciò che fà, anzi, ciò che non gli rifaccio fare nel Load, ma sono costretto a non fargli ricaricare il DataTable, altrimenti come potrei modificare un valore nel DB !

Grazie di nuovo
256 messaggi dal 30 novembre 2004
il codice della gridview?
7 messaggi dal 28 gennaio 2021
eccolo, e grazie.

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="PianificaWeb.WebForm2" %>

<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<asp:Panel ID="panel1" runat="server" Height="100px" Width="930px" ScrollBars="Horizontal">
<asp:GridView ID="GridView2" runat="server" DataKeyNames="codice_fiscale" OnRowDataBound="GridView_RowDataBound" Width="938px" AutoGenerateColumns="False" Font-Names="Arial" Font-Size="Smaller">
<Columns>
<asp:BoundField DataField="codice_fiscale" HeaderText="codice_fiscale" ItemStyle-Width="280px" ReadOnly="True" SortExpression="codice_fiscale" Visible="False" >
<ItemStyle Width="280px"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="Cognome_Nome" HeaderText="Cognome e Nome" ItemStyle-Width="180px" ReadOnly="True" SortExpression="Cognome_Nome" >
<ControlStyle Width="180px" />
<ItemStyle Wrap="False"></ItemStyle>
</asp:BoundField>
</Columns>
<EditRowStyle Font-Names="Arial" Font-Size="Small" />
</asp:GridView></asp:Panel>
&nbsp;_______________________________________________________________________________________<br />
&nbsp;<br />
<asp:Button ID="ButtonOK" runat="server" Text="Memorizza" OnClick="ButtonOK_Click" />
<asp:Label ID="Label2" runat="server" BackColor="#FF6600" Text="Label"></asp:Label>
<br />
</asp:Content>
7 messaggi dal 28 gennaio 2021
Scusate l'assenza, ma ..... sono ancora in alto mare sigh, sigh

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.