1 messaggio dal 27 agosto 2005
Ciao ragazzi,
ho creato un banale controllo:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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 UCwithLB : System.Web.UI.UserControl
{
protected Int32 nLinks = 0;
public Int32 Links
{
get { return nLinks; }
set { nLinks = value;
ViewState["links"] = nLinks;
}
}

protected void myClick(object sender, EventArgs e)
{
((LinkButton)sender).Text += " <- THIS!!!";
}

public void MakeControl()
{
Table tb;
TableRow tr;
TableCell tc;
LinkButton lb;

if (nLinks == 0)
return;

tb = new Table();
tr = new TableRow();

for (Int32 x = 0; x < nLinks; x++)
{
tc = new TableCell();
lb = new LinkButton();
lb.Text = "Link Nr. " + ( x + 1 ).ToString().PadLeft(3, '0');
lb.Click += new EventHandler(this.myClick);
tc.Controls.Add(lb);
tr.Cells.Add(tc);
}

tb.Rows.Add(tr);

this.Controls.Add(tb);
}

protected void Page_Load(object sender, EventArgs e)
{
if (ViewState["links"] != null)
nLinks = (Int32)ViewState["links"];

this.MakeControl();
}
}

Il controllo crea un numero N di links in base alla proprietà settabile dall'esterno...

Ora ho una pagina come la seguente:

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

<%@ Register Src="UCwithLB.ascx" TagName="UCwithLB" TagPrefix="uc1" %>

<!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>Pagina senza titolo</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="btn1Link" runat="server" Text="Crea un link" OnClick="btn1Link_Click" />
<asp:Button ID="btn2Link" runat="server" Text="Crea due link" OnClick="btn2Link_Click" />
<asp:Button ID="btn3Link" runat="server" Text="Crea tre link" OnClick="btn3Link_Click" />
<asp:Button ID="btn4Link" runat="server" Text="Crea quattro link" OnClick="btn4Link_Click" />
</div>
<div>
<uc1:UCwithLB ID="UCwithLB1" runat="server" />
</div>
</form>
</body>
</html>

dove eseguo semplicemente questo codice:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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 Default8 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if( !Page.IsPostBack)
UCwithLB1.MakeControl();
}

protected void btn1Link_Click(object sender, EventArgs e)
{
UCwithLB1.Links = 1;
}

protected void btn2Link_Click(object sender, EventArgs e)
{
UCwithLB1.Links = 2;
}

protected void btn3Link_Click(object sender, EventArgs e)
{
UCwithLB1.Links = 3;
}

protected void btn4Link_Click(object sender, EventArgs e)
{
UCwithLB1.Links = 4;
}

}

Problema: il controllo aggiorna il suo stato non subito ma alla seconda pressione di un tasto.

Sto seguendo la strada giusta oppure ho sbagliato alla grande?

Accettasi soluzioni...

---------------------------------------------------------------------
E' difficile acchiappare un gatto nero in una stanza buia soprattutto quando non c'è.
Ti consiglio di sfruttare questa tecnica ereditando da CompositeControl invece che da WebControl.
Sovascrivi il metodo CreateChildControls e lì dentro crei i controlli.
Nel set della proprietà Links fai che se la proprietà ChildControlsCreated è true fai un
this.Controls.Clear();
base.ClearChildViewState();
ChildControlsCreated=false;
this.EnsureChildControls();

così cancelli i controlli e li ricrei.
Magari nella proprietà non usare il field privato ma usa direttamente ViewState["links"].
In questo modo ad ogni postback il metodo CreateChildControls parte sempre ed è inizializzato prima di caricamenti dei ViewState dei figli e prima che partano eventi dei controlli.
Non l'ho visto nell'esempio ma distingui sempre la fase di creazione dei controlli dalla fase di binding e caricamento dati. In questo caso ti conviene ereditare da CompositeDataBoundControl.

Ciao

Il mio blog
Homepage

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.