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:
/// <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> publicstaticvoid 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 ordenadosfor(int i =0; i < ListItems.Count; i++){
ListBox.Items.Add((ListItem)ListItems[ListItems.GetKey(i)]);}}
/// <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:
É 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
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:
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;}}returnnull;}
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;
}
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.