29 messaggi dal 02 dicembre 2003
Ciao a tutti.
Se all'interno di un repeate ho messo un CustomControl che ha l'evento click, come faccio scatenare l'evento?

questo è come valorizzo il repeater
private void repeaterIndice_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
OggettiDominio.torreIndice torreIndex = (OggettiDominio.torreIndice)e.Item.DataItem;

((voceIndice)e.Item.FindControl("voceSezione")).Click += new EventHandler(this.voceSezione_Click);

if (tmpArea.ToString().Trim() != torreIndex.Area.ToString().Trim())
{
tmpArea = torreIndex.Area;
((voceIndice)e.Item.FindControl("voceSezione")).Text = torreIndex.Area;
((voceIndice)e.Item.FindControl("voceSezione")).Classe = "IndiceLeft";
}
else
{
((voceIndice)e.Item.FindControl("voceSezione")).Text = torreIndex.Sezione;
((voceIndice)e.Item.FindControl("voceSezione")).Classe = "IndiceRight";
((voceIndice)e.Item.FindControl("voceSezione")).Link = torreIndex.Link;
}
}
Il tuo controllo custom deve implementare opportunamente l'interfaccia
IPostBackEventHandler. Tramite l'implementazione del metodo dell'interfaccia puoi attivare l'evento e generare un postback.

public interface IPostBackEventHandler
{
      // Methods
      void RaisePostBackEvent(string eventArgument);
}


Ciao, Ricky.

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
29 messaggi dal 02 dicembre 2003
questo è il mio custom Control
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections;


namespace CdT.Tag
{
/// <summary>
/// Summary description for voceIndice.
/// </summary>
///
[DefaultProperty("Text"),
ToolboxData("<{0}:voceIndice runat=server></{0}:voceIndice>")]
public class voceIndice:System.Web.UI.Control , IPostBackEventHandler
{
#region Proprietà voceIndice

/// <summary>
/// Testo visualizzato
/// </summary>
private string text;
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string Text
{
get { return text; }
set { text = value; }
}

/// <summary>
/// pagina da linkare
/// </summary>
private string link;
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string Link
{
get { return link; }
set { link = value; }
}

/// <summary>
/// classe di rappresentazione del foglio di stile
/// </summary>
private string classe;
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string Classe
{
get { return classe; }
set { classe = value; }
}

/// <summary>
/// funzione javascript da richiamare
/// </summary>
private string funzioneJS;
[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string FunzioneJS
{
get { return funzioneJS; }
set { funzioneJS = value; }
}
#endregion


//generazione dell'evento Click
public event EventHandler Click;

//Gestione dell'evento OnClick
protected virtual void OnClick(EventArgs e)
{
if (Click != null)
Click(this, e);
}

public void RaisePostBackEvent(string eventArgument)
{
OnClick(new EventArgs());
}

/// <summary>
/// Render this control to the output parameter specified
/// </summary>
/// <param name="output"> The HTML writer to write out to </param>
protected override void Render(HtmlTextWriter output)
{

// Stringa per la costruzione del TD in HTML
string tdString = "";

tdString = "<td class=\"" + Classe + "\"";

// Gestione Client-Side
tdString += " onclick=\"" + funzioneJS + "\">";

//Testo della voce di menu
tdString += text;

//Chiusura del tag
tdString += "</td>";

output.Write(tdString);

}
}
}

il problema e che non mi ascturisce nessuno evento, ma il repeater me lo costruisce correttamente.
Deriva il controllo da WebControl e modifica il codice come segue (io preferisco usare gli accessor).

private static readonly object EventClick;

static voceIndice()
{
voceIndice.EventClick = new object();
}

protected virtual void OnClick(EventArgs e)
{
EventHandler hndl = (EventHandler) base.Events[voceIndice.EventClick];
if (hndl != null) hndl(this, e);
}

public event EventHandler Click
{
      add { base.Events.AddHandler(voceIndice.EventClick, value); }
      remove { base.Events.RemoveHandler(voceIndice.EventClick, value); }
}


Ciao, Ricky.
Modificato da rickyvr il 28 febbraio 2006 18.19 -

Ing. Riccardo Golia
Microsoft MVP ASP.NET/IIS
ASPItalia.com Content Manager
http://blogs.aspitalia.com/rickyvr
http://ricky.aspitalia.com
http://www.riccardogolia.it
29 messaggi dal 02 dicembre 2003
Grazie, ma non mi fuziona nemmeno in questo modo.
Il problema l'ho quando metto il CustomControl all'interno del repeater, non mi intercetta l'evento Click, ne tanto meno ItemCommand del repeater.
Forse sbaglio qualcosa quando prepato il repeater?
Questo è il codice:
private void repeaterIndice_ItemDataBound(object sender, RepeaterItemEventArgs e)
{

OggettiDominio.torreIndice torreIndex = (OggettiDominio.torreIndice)e.Item.DataItem;

((voceIndice)e.Item.FindControl("voceSezione")).Click += new EventHandler(this.voceSezione_Click);

if (tmpArea.ToString().Trim() != torreIndex.Area.ToString().Trim())
{
tmpArea = torreIndex.Area;

((voceIndice)e.Item.FindControl("voceSezione")).Text = torreIndex.Area;
((voceIndice)e.Item.FindControl("voceSezione")).Classe = "IndiceLeft";
}
else
{
((voceIndice)e.Item.FindControl("voceSezione")).Text = torreIndex.Sezione;
((voceIndice)e.Item.FindControl("voceSezione")).Classe = "IndiceRight";
((voceIndice)e.Item.FindControl("voceSezione")).Link = torreIndex.Link;
}
}
considera che l'evento IteDataBound se usi la classica forma nel PageLoad

if(!thi.Page.IsPostBack)....associo i dati....


solo alla prima esecuzione della pagina il metodo repeaterIndice_ItemDataBound verrà eseguito.

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.