Estou postando um exemplo de página que adiciona controles dinamicamente no formulário. Neste exemplo eu utilizei vários UpdatePanel com Triggers configuradas e, em especial, o controle PlaceHolder. Este controle guarda todos os controles adicionados dinamicamente. A mágica deste código é que eu não preciso ficar remontando os controles toda vez que a página faz uma requisição ao servidor.
Código da página .aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AddControlDinamycHandler.aspx.cs"
Inherits="AddControlDinamycHandler" %>
<!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>Add Control Dinamyc Asp.Net</title>
<script src="Includes/Js/JQuery/lib/jquery-1.3.2.min.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server" method="post">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<Triggers>
<%--<asp:AsyncPostBackTrigger ControlID="ddlIS" EventName="SelectedIndexChanged" />--%>
<asp:AsyncPostBackTrigger ControlID="Button2" EventName="click" />
</Triggers>
<ContentTemplate>
<%-- <asp:DropDownList ID="ddlIS" runat="server" TabIndex="13" AutoPostBack="true" OnSelectedIndexChanged="ddlIS_SelectedIndexChanged">
<asp:ListItem Value="0">--------------------------</asp:ListItem>
<asp:ListItem Value="1" Text="numero">
</asp:ListItem>
<asp:ListItem Value="2" Text="id">
</asp:ListItem>
<asp:ListItem Value="3" Text="nome">
</asp:ListItem>
<asp:ListItem Value="4" Text="Entre R$ 500 mil e R$ 750 mil">
</asp:ListItem>
<asp:ListItem Value="5" Text="Entre R$ 750 mil e R$ 1 milhão">
</asp:ListItem>
<asp:ListItem Value="6" Text="Acima de R$ 1 milhão">
</asp:ListItem>
</asp:DropDownList>--%>
<asp:CheckBoxList ID="CheckBoxList1" runat="server">
<asp:ListItem Value="0">unidade</asp:ListItem>
<asp:ListItem Value="1" Text="numero">
</asp:ListItem>
<asp:ListItem Value="2" Text="id">
</asp:ListItem>
<asp:ListItem Value="3" Text="nome">
</asp:ListItem>
<asp:ListItem Value="4" Text="Entre R$ 500 mil e R$ 750 mil">
</asp:ListItem>
<asp:ListItem Value="5" Text="Entre R$ 750 mil e R$ 1 milhão">
</asp:ListItem>
<asp:ListItem Value="6" Text="Acima de R$ 1 milhão">
</asp:ListItem>
</asp:CheckBoxList>
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<%-- <Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="click" />
</Triggers>--%>
<ContentTemplate>
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
<div id="divControls">
</div>
<asp:Button ID="Button2" runat="server" Text="Gerar Filtros" OnClientClick="CallAjax(10, '', '');" />
<br />
<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="click" />
</Triggers>
<ContentTemplate>
<asp:Button ID="Button1" runat="server" Text="Ler Filtros" OnClick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>
<asp:UpdatePanel ID="UpdatePanel4" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="click" />
</Triggers>
<ContentTemplate>
<asp:Label ID="lblControleNome" runat="server" Text=""></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<asp:HiddenField ID="hdArrayCodigos" runat="server" />
</div>
</form>
<script language="javascript" type="text/javascript">
var controles;
function InserirControles() {
controles += $get('hdArrayCodigos').value;
$get('divControls').innerHTML = controles;
}
// var pageReqManger = Sys.WebForms.PageRequestManager.getInstance();
// pageReqManger.add_pageLoading(OnPageLoading);
// /// To execute on page loading while async postback
// function OnPageLoading(sender, args) {
// var dataItems = args.get_dataItems();
// if ($get('hdArrayCodigos') !== null)
// $get('hdArrayCodigos').value = dataItems['hdArrayCodigos'];
// InserirControles();
// }
function CallAjax(CoAgencia, DtInicial, DtFinal) {
var cookmsn = null; // readCookie('mensagem');
var html = '';
if (cookmsn == null || cookmsn == "") {
try {
html = $.ajax({
type: "POST",
url: "pagina.tb?cod=txtNome"+ new Date().getTime(),
data: "CoAgencia=" + CoAgencia,
success: function (html) {
},
async: false
}).responseText;
}
catch (Error) { }
}
$get('divControls').innerHTML = html;
}
//CallAjax(10, '', '');
</script>
</body>
</html>
Código do .cs da página .aspx:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
public partial class AddControlDinamycHandler : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//foreach (var item in Page.Controls)
//{
// if (item.GetType() == typeof(TextBox))
// {
// TextBox textbox = item as TextBox;
// lblControleNome.Text += textbox.ID;
// }
//}
lblControleNome.Text = this.Request.Form["txt0"];
lblControleNome.Text += this.Request.Form["txt1"];
lblControleNome.Text += this.Request.Form["txt2"];
lblControleNome.Text += this.Request.Form["txt3"];
lblControleNome.Text += this.Request.Form["txt4"];
lblControleNome.Text += this.Request.Form["txt5"];
lblControleNome.Text += this.Request.Form["txt6"];
lblControleNome.Text += this.Request.Form["txtNome"];
}
protected void Button2_Click(object sender, EventArgs e)
{
foreach (ListItem item in CheckBoxList1.Items)
{
if (item.Selected)
{
TextBox textbox1 = new TextBox();
textbox1.ID = "txt" + item.Value;
textbox1.Text = item.Text;
PlaceHolder1.Controls.Add(textbox1);
PlaceHolder1.Controls.Add(new HtmlGenericControl("br"));
}
}
UpdatePanel2.Update();
}
protected void ddlIS_SelectedIndexChanged(object sender, EventArgs e)
{
//string TextBoxControl = "<input type=text name=txt1 id=txt1 runat=server/>";
//registra os dados da loterica para serem passados para o campo que está fora do updatepanel
//ScriptManager1.RegisterDataItem(hdArrayCodigos, Server.HtmlDecode(TextBoxControl));
//TextBox textbox1 = new TextBox();
//textbox1.ID = "text1";
//textbox1.Text = ddlIS.SelectedItem.Text;
//PlaceHolder1.Controls.Add(textbox1);
//textbox1 = new TextBox();
//textbox1.ID = "text2";
//textbox1.Text = ddlIS.SelectedItem.Text;
//PlaceHolder1.Controls.Add(textbox1);
//textbox1 = new TextBox();
//textbox1.ID = "text3";
//textbox1.Text = ddlIS.SelectedItem.Text;
//PlaceHolder1.Controls.Add(textbox1);
}
}
Código do Handler:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI;
namespace Business
{
public class TextboxHandler : IHttpHandler
{
public bool IsReusable
{
get
{
return true;
}
}
public void ProcessRequest(HttpContext context)
{
//TextBox textbox1 = new TextBox();
//textbox1.ID = Guid.NewGuid().ToString();
//textbox1.Text = "TextBox" + textbox1.ID;
var req = context.Request["cod"];
context.Response.Write(string.Format("<input tyep=text id={0} runat=server name={1}></input>",Guid.NewGuid().ToString(),req));
}
}
}
<httpHandlers>
<add path="*.tb" verb="*" type=" Business.TextboxHandler, Business"/>
</httpHandlers>
Comentários