Arquivo da tag: ASP.NET

ASP.NET – Preenchendo o controle Repeater com um Array de String

O controle Repeater tem um único defeito, que é também sua maior virtude. Peca pela simplicidade.

Entre algumas coisas que precisei fazer recentemente, uma era colocar os itens de um Array em uma página ASP.NET. Querendo fugir do Response.Write e da concatenação de itens dentro de um laço de repetição, decidi usar o bom e velho Repeater. O problema é que, após definir o DataSource do dito como sendo o Array de Strings, não há como informar o “Value” ou “Text” de um Array para o Eval() ou Bind(). Solução: Basta mencionar o Container.DataItem no código aspx que o Repeater se encarrega de efetuar o “Bind” com o Array:

1
2
3
4
5
6
7
8
9
10
11
12
13
	<asp:Repeater ID="RepeaterArray" runat="server">
	    <HeaderTemplate>
	    	 <ul>
	    </HeaderTemplate>
	    <ItemTemplate>
		<li>
		        <%# Container.DataItem %>
		</li>
	    </ItemTemplate>
	    <FooterTemplate>
                </ul>
	    </FooterTemplate>
	</asp:Repeater>
1
2
3
4
5
6
7
8
9
string[] meuArray = new string[] {
        "item 1",
        "item 2",
        "item 3",
        "item 4",
        "item 5" };
 
RepeaterArray.DataSource = meuArray;
RepeaterArray.DataBind();

Mais simples impossível. Bom proveito!

ASP.NET – Ordenando o controle Lisbox

Funções utilitárias sempre quebram um bom galho. Sem muito rodeio, o código abaixo efetua a ordenação dos itens de um controle ASP.NET ListBox:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/// <summary>
/// Ordena um listbox em ordem Ascendente
/// </summary>
/// <param name="ListBox">O controle ListBox a ser ordenado</param>
/// <param name="ByValue">True se a ordenação deve ser feita pelo Valor(Value)
/// ou False para orndenar pelo Texto (Text)</param> 
public static void sortListBox(ref ListBox ListBox, bool ByValue)
{
	SortedList ListItems = new SortedList();
 
	// adicionar os items do ListBox ao SortedList 
	foreach (ListItem Item in ListBox.Items)
	{
		if (ByValue) ListItems.Add(Item.Value, Item);
		else ListItems.Add(Item.Text, Item);
	}
 
	// limpa o controle
	ListBox.Items.Clear();
 
	// adicionar o itens ordenados
	for (int i = 0; i < ListItems.Count; i++)
	{
		ListBox.Items.Add((ListItem)ListItems[ListItems.GetKey(i)]);
	}
}

Como menciona o comentário, o segundo parâmetro define se os itens serão ordenados pela propriedade Value ou Text. Dei uma “brasileirada” no código. A referência original pode ser vista neste link:

http://forums.asp.net/p/1202130/2094935.aspx

Bom proveito!

ASP.NET – Redirecionando para a mesma Página

É relativamente simples fazer com que uma página ASP.NET redirecione para si mesmo, o que faz com que ela volte ao seu estado inicial, não caracterizando um “PostBack”. Existem 3 opções:

1. Response.Redirect(Request.Path);

Onde o Path retorna a url relativa da página corrente, por exemplo: /Pasta/Pagina.aspx

2. Response.Redirect(Request.RawUrl);

A diferença principal para o Path é que o RawUrl traz também todas as informações da url, incluindo a querystring, por exemplo: /Pasta/Pagina.aspx?Parametro=Valor

3. Response.Redirect(Request.Url.ToString());

Neste caso, a objeto Url da classe Uri traz informações completas sobre esta. A chamada do método ToString deste objeto traz uma string com a Url absoluta:  http://localhost/Pasta/Pagina.aspx?Parametro=Valor

Métodos simples que resolvem o problema.

Referências:

http://metadeveloper.blogspot.com/

Redirect Method

http://msdn.microsoft.com/en-us/library/system.web.httpresponse.redirect.aspx

HttpRequest Object

http://msdn.microsoft.com/pt-br/library/system.web.httprequest.aspx

ASP.NET – Page.FindControl retornando null

O método FindControl da classe Control retorna um controle da coleção Controls da própria classe pela propriedade ID. Comumente utilizamos este método para encontrar algum controle cujo ID é passado por parâmetro ou quando o controle é gerado dinamicamente. Mais comum ainda é usá-lo para obter um controle em uma linha do GridView, tipicamente no evento RowDataBound.

O caso é que algumas vezes, mesmo sabendo que o controle existe na página, ao realizar um Page.FindControl por um ID de um controle conhecido, o método retorna null. A razão é simples. A hierarquia de controles de uma página ASP.NET faz com que os controles não fiquem relacionados diretamento à coleção de controles da página.

A figura abaixo mostra a hieraquia de controles de uma página ASP.NET no modelo WebForms:

Hierarquia de Controles de uma página ASP.NET/WebForms
Hierarquia de Controles de uma página ASP.NET/WebForms
Além dessa hierarquia, é preciso contar com o fato de que seu controle pode estar dentro de um outro do tipo “container”, como um PlaceHolder, Panel ou mesmo em um UserControl. Para resolver definitivamente o controle de encontrar um controle na sua página, é preciso fazer uma busca recursiva. Lembra do Fatorial? Pois é. A rotina abaixo faz uma busca recursiva dentro de um controle, passando o ID do controle procurado por parâmetro:

private Control FindControlRecursive(Control root, string id)
{
    if (root.ID == id)
    {
        return root;
    } 
 
    foreach (Control c in root.Controls)
    {
        Control t = FindControlRecursive(c, id);
        if (t != null)
        {
            return t;
        }
    } 
 
    return null;
}

A chamada da função fica bem simples:

1
FindControleRecursive(this.Page, "IDdoMeuControle");

Isso resolve o problema de encontrar seu controle, mesmo tendo certeza de que ele está na página.

Nem tudo são flores

Apesar de esta parecer a solução de todos os problemas (e até é), o problema desta rotina é a performance. Apesar de não haver uma perda muito grande desta, se houver alguma outra forma de identificar o controle procurado mais diretamente e sua lógica permitir, prefira-a. Isso vai poupar um bom processamento.

Fonte: http://www.codinghorror.com/blog/archives/000307.html

Tomás