13 messaggi dal 24 marzo 2006
Ciao a tutti,
avrei bisogno di aiuto relativamente al seguente problema.

Non riesco a far funzionare un TemplateField (con i comandi Edit, Delete e New) definito staticamente contemporaneamente a dei Fields definiti dinamicamente.

In pratica quando, durante il periodo di vita della pagina, devo ridefinire i fields dinamici ad un certo punto il TemplateField perde il suo contenuto.

Sono riuscito a riprodurre il comportamento anomalo su di un piccolo esempio (in allegato).
Nell'esembio dopo un paio di click sul bottone (che simula la ri-assegnazione dei fields dinamici) il TemplateField (che non viene toccato dal codice) si svuota.

L'esempio è molto semplice però riproduce perfettamente il problema. In seguito comunque riporto maggiori informazioni su quanto fatto e perchè.

Per quanto ho potuto vedere il problema risiede nella RemoveAt che elimina i fields definiti in precedenza (ad eccezione del template dinamico), infatti teoricamente eliminando questa operazione il TemplateField rimane popolato.

Ogni aiuto sarà ben accetto

Grazie Mille
Roberto

Pagina di esemptio


default.aspx
<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            SelectCommand="SELECT * FROM [Customers]" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"></asp:SqlDataSource>
        <br />
        <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataKeyNames="CustomerID"
            DataSourceID="SqlDataSource1" Height="50px" Width="125px">
            <Fields>
                <asp:TemplateField ShowHeader="False">
                    <EditItemTemplate>
                        <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update"
                            OnClientClick="return confirm('Vuoi confermare le modifiche?');"
                        Text="Update"></asp:LinkButton>
                        <asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel"
                            OnClientClick="return confirm('Vuoi eliminare le modifiche?');"
                            Text="Cancel"></asp:LinkButton>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit"
                            Text="Edit"></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
            </Fields>
        </asp:DetailsView>
        <br />
        &nbsp;</div>
    </form>
</body>
</html>


defaults.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BoundField f = new BoundField();
            f.DataField = "CustomerID";
            DetailsView1.Fields.Add(f);
        }
        
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        while (DetailsView1.Fields.Count > 1)
            DetailsView1.Fields.RemoveAt(1);
        BoundField f = new BoundField();
        f.DataField = "CustomerID";
        DetailsView1.Fields.Add(f);
    }
}




Dettaglio


In pratica sto sviluppando una pagina per il data entry in cui la tabella di lavoro viene selezionata dinamicamente all'interno della pagina e può essere cambiata sempre durante il ciclo di vita della pagina.

A questo scopo ho scelto di usare una DetailsView a cui una volta selezionata la tabella aggiungo i Field relativi.
Questa ha funzionato correttamente con la configurazione:
AutoGenerateEditButton=true;
AutoGenerateInsertButton=true;
AutoGenerateDeleteButton=true;
AutoGenerateRows=false;

Questa configurazione non mi permette però di avere una cosa fondamentale, dei popup che richiedano conferma sulle varie operazioni di cancellazione, aggiornamento ed inserimento.
La soluzione che ho individuato è quella di utilizzare un TemplateField in cui sono presenti i vari comandi (che ho generato creando prima dei CommandField e poi convertendoli in TemplateField) all'interno del quale sui LinkButton che mi interessavano ho valorizzato la proprietà:
OnClientClick="return confirm('Vuoi confermare la modifica?');"

A questo punto però ho avuto la brutta sorpresa del TemplateField che perde il contenuto.
devi riconsiderare la logica con cui aggiungi e togli le Field, partendo dal presupposto che per mantenere lo stato devi ricreare ad ogni PostBack l'intero albero dei controlli come nello stato precedente e solo dopo fare eventuali modifiche

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
13 messaggi dal 24 marzo 2006
Ciao Marco,
Ho tentato di capire cosa intendessi con ricreare l'albero dei controlli.
In debug ho verificato che i fields aggiunti dinamicamente sono presenti nei postback successivi senza necessità di ricrearli.

Per il momento ho aggirato il problema inserendo dei LinkButton fuori dalla DetailsView per gestire esplicitamente le funzioni di Edit, Delete ed Insert lasciando nella details view solo i BoundFields creati dinamicamente.
Non mi dispiacerebbe comunque capire perchè non funziona nel modo che avevo previsto originariamente.

Grazie Mille
Roberto
purtroppo non ho tempo per verificare il comportamento che hai descritto, appena trvo del tempo però lo ricontrollo, se ti interessa su aspitlia nello #864 viene creata una CommandFiled per il supporto a javascript.

dai un occhiata per vedere se ti può essere utile.

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx

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.