<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>3f blog &#187; CompositeControl</title>
	<atom:link href="http://blog.soluciones3f.com.ar/tag/compositecontrol/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.soluciones3f.com.ar</link>
	<description>Experiencias compartidas</description>
	<lastBuildDate>Tue, 01 Nov 2011 18:08:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>CompositeControl contenido en un tag Div en lugar de Span</title>
		<link>http://blog.soluciones3f.com.ar/2008/04/06/compositecontrol-contenido-en-un-tag-div-en-lugar-de-spam/</link>
		<comments>http://blog.soluciones3f.com.ar/2008/04/06/compositecontrol-contenido-en-un-tag-div-en-lugar-de-spam/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 07:20:51 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[CompositeControl]]></category>
		<category><![CDATA[WebControl]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=39</guid>
		<description><![CDATA[Si uno observa mi post anterior, podrá apreciar que le paso al constructor de WebControl un parámetro HtmlTextWriterTag que le indica al control, que tag debe emplear a circunscribir todos los demás controles. Sin embargo, si heredo de CompositeControl, no tengo esa opción de pasarle al constructor un parámetro, y por default simpre usará un [...]]]></description>
			<content:encoded><![CDATA[<p>Si uno observa mi post anterior, podrá apreciar que le paso al constructor de WebControl un parámetro HtmlTextWriterTag que le indica al control, que tag debe emplear a circunscribir todos los demás controles.</p>
<p>Sin embargo, si heredo de CompositeControl, no tengo esa opción de pasarle al constructor un parámetro, y por default simpre usará un Span.</p>
<p>Si yo quiero que mi clase heredada de CustomControl tenga un tag diferente al div, deberé sobrecargar la propiedad TagKey, como hago en este ejemplo para que mis controles estén contenidos en un tag Div.</p>
<pre lang="c#">public class FiltersControl : CompositeControl
{
    ///
<summary>
    /// Envolvemos el control en un tag Div
    /// </summary>

    protected override HtmlTextWriterTag TagKey
    {
        get
        {
            return HtmlTextWriterTag.Div;
        }
    }
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2008/04/06/compositecontrol-contenido-en-un-tag-div-en-lugar-de-spam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.Net, Dynamic Controls, WebControls y ViewState</title>
		<link>http://blog.soluciones3f.com.ar/2008/04/06/net-dynamic-controls-webcontrols-y-viewstate/</link>
		<comments>http://blog.soluciones3f.com.ar/2008/04/06/net-dynamic-controls-webcontrols-y-viewstate/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 06:34:58 +0000</pubDate>
		<dc:creator>fernando</dc:creator>
				<category><![CDATA[programacion]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[CompositeControl]]></category>
		<category><![CDATA[Control]]></category>
		<category><![CDATA[INamingContainer]]></category>
		<category><![CDATA[Interfaz marcador]]></category>
		<category><![CDATA[Marker interface]]></category>
		<category><![CDATA[ViewState]]></category>
		<category><![CDATA[WebControl]]></category>

		<guid isPermaLink="false">http://blog.soluciones3f.com.ar/?p=38</guid>
		<description><![CDATA[Para un proyecto necesito hacer un &#8220;Custom Control&#8221; (tambien llamados a veces Server Controls o WebControls) que sea una composición de controles generados dinamicamente porque no puedo saber a priori ni la cantidad ni el tipo de controles que necesitaré. Además necesitaba que mantuvieran, estos controles dinámicos, el viewstate. Me tropecé con un montón de [...]]]></description>
			<content:encoded><![CDATA[<p>Para un proyecto necesito hacer un &#8220;Custom Control&#8221; (tambien llamados a veces Server Controls o WebControls) que sea una composición de controles generados dinamicamente porque no puedo saber a priori ni la cantidad ni el tipo de controles que necesitaré. Además necesitaba que mantuvieran, estos controles dinámicos, el viewstate.</p>
<p>Me tropecé con un montón de trabas, así que en lugar de intentar mi problema original, comencé con casos muchos mas simples para intentar apuntar a cada problema que tenía específico. El más molesto de todos ellos era que el ViewState se perdía en cada postback.</p>
<p>Originalmente mi clase de prueba, que agregaba dos textbox y un botón para testear el postback era así:</p>
<pre lang="c#">
public class FiltersControl : WebControl
{
    public FiltersControl() : base(HtmlTextWriterTag.Div) { }

    protected override void CreateChildControls()
    {
        TextBox text1 = new TextBox();
        TextBox text2 = new TextBox();

        Button button = new Button();
        button.Text = "Postback!";

        Controls.Add(text1);
        Controls.Add(text2);
        Controls.Add(button);
    }
}</pre>
<p>Pero fallaba inmediatamente, sin embargo si lo heredaba de CompositeControl funcionaba perfectamente. Gracias a <a href="http://www.aisto.com/roeder/dotnet/">Lutz Roeder&#8217;s Reflector</a> e investigando como funcionaba CompositeControl llegué a la conclusión que agregando únicamente la <a href="http://msdn2.microsoft.com/es-ar/library/system.web.ui.inamingcontainer(VS.80).aspx">interfaz marcador INamingContainer</a> se solucionaban todos los problemas, al menos en ese código tan simple.</p>
<p>Así que el siguiente código funciona como uno esperaría, y se puede apreciar que es idéntico al anterior, pero esta vez la clase tiene una interfaz.</p>
<pre lang="c#">
public class FiltersControl : WebControl, INamingContainer
{
    public FiltersControl() : base(HtmlTextWriterTag.Div) { }

    protected override void CreateChildControls()
    {
        TextBox text1 = new TextBox();
        TextBox text2 = new TextBox();

        Button button = new Button();
        button.Text = "Postback!";

        Controls.Add(text1);
        Controls.Add(text2);
        Controls.Add(button);
    }
}</pre>
<p>Moraleja, si implementan un control, que contiene otros controles, aún cuando saben que no habrá conflictos de nombres, o heredan de CompositeControl o lo hacen de Control (o alguna clase que herede) y marcan la clase con la interfaz INamingConteiner para no tener problemas con el ViewState</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.soluciones3f.com.ar/2008/04/06/net-dynamic-controls-webcontrols-y-viewstate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

