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 />
</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.