- Viewstate loosing ASP.Net Grids?
-
I ran into a strange problem today that i wanted to share with you.
I had a page with a DataGrid on it, and for some reason, when i posted back to the page, the grid showed zero items in the collection. I had no code messing with the viewstate of the pages or controls, so i was really stumped.
The page this datagrid was on had a lot of complexity, so i tried to simplify the page to find the problem out. I managed to create one test page that reproduced the problem.
This was the markup:
...
<body>
<form id="form1" runat="server">
<div>
<asp:DataGrid ID="dgTeste" runat="server" DataMember="TestTable">
</asp:DataGrid>
<asp:GridView ID="gvTeste" runat="server" DataMember="TestTable">
</asp:GridView>
<cc2:UpdatedPanelControl ID="UpdatedPanelControl1" runat="server">
</cc2:UpdatedPanelControl>
<asp:Button ID="btnPostBack" runat="server" Text="PostBack" />
</div>
</form>
</body>
...
And the codebehind was like so :
...
public partial class _Default : System.Web.UI.Page
{
protected DataSet test = new DataSet();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
test = new DataSet();
test.Tables.Add("TestTable");
test.Tables["TestTable"].Columns.AddRange(new DataColumn[] { new DataColumn("Column1"), new DataColumn("Column2") });
test.Tables["TestTable"].Rows.Add(new object[] { "1", "1" });
test.Tables["TestTable"].Rows.Add(new object[] { "2", "2" });
gvTeste.DataSource = test;
gvTeste.DataBind();
dgTeste.DataSource = test;
dgTeste.DataBind();
}
Response.Write("GridView Rows : " + gvTeste.Rows.Count + "<br>");
Response.Write("GridView Rows : " + dgTeste.Items.Count);
}
}
...
Now, you'll note i've got a user control on the page that is not shown. Well, the code for that control is this :
...
public class UpdatedPanelControl : Panel
{
protected override void OnInit(EventArgs e)
{
bool result = TraverseControlCollection(this.Parent);
base.OnInit(e);
}
private bool TraverseControlCollection(Control control)
{
foreach (Control childControl in control.Controls)
{
TraverseControlCollection(childControl);
}
return true;
}
}
...
If you try this combination out, you'll note that the DataGrids do not have any rows on the Postback event after you click the button.
The reason for this is the TraverseControlCollection(this.Parent); line. If you remove this line from the user control, all will work as expected. Apparently you cannot traverse the control tree while on an OnInit event. This excellent post might shed some light on why this happens, but i really didn't find any information on it.
Hope that this will give you at least one hint on why you might be loosing Viewstate in your ASP.Net controls.
- Como convencer pessoas a partilhar o seu conhecimento
-
Ok.. Pelo título do post, podem pensar que este post não tem nada a ver com Arquitectura. Mas tem.
Imaginem vocês que pertencem a uma empresa que faz software à medida... Imaginem também que o conhecimento dessa empresa, tal como a maior parte das empresas que desenvolvem software, está na cabeça das pessoas que desenvolvem, desenham e/ou analisam um determinado projecto. Ora, para uma empresa que vive da realização de projectos, faz sentido existir um repositório de conhecimento partilhado por todos, e acessível a todos, certo?
Para que esse repositório exista, imaginem que criam um portal interno, acessível de fora da empresa, que permite às pessoas publicar esse conhecimento além de conter outra informação relevante para as mesmas.
Está montada uma arquitectura que permita a colaboração entre as pessoas da empresa certo?
Infelizmente, a minha experiência diz-me que não. Como é que se consegue que as pessoas participem nesta iniciativa, para que a empresa ganhe a sua "Knowledge Base" comum, e garanta que a saída de pessoas individualmente não prejudique o conhecimento global da empresa?
Quando conseguir esse objectivo no projecto que da minha empresa, logo vos direi.
- TechDays 2007 - DEV021 - Recursos
-
Agora que o Techdays já terminou a algum tempo, aqui fica um link para o post do Paulo que dá todos os recursos da sessão.
Infelizmente ninguém gravou a minha parte da sessão, e eu tb não me lembrei de levar a minha Máquina Fotográfica para fazer uns vídeos. :-(
Enfim.. Mais um evento que foi bem sucedido. E cada vez mais gosto de fazer apresentações para partilhar o meu conhecimento.
- TechDays 2007 - 1º Dia
-
Hoje cheguei cedo ao TechDays, e tive um pouco de tempo para escrever.
Das sessões a que fui ontem, (que foram um pouco diferentes do que tinha programado), tenho de destacar uma:
DEV002 : The Microsoft Web Story - Jeff Prosise.
É um orador excelente, e apesar do conteúdo não ser nada de extraordinário (porque falava maioritariamente do passado da Web) consegui passar a mensagem do que a maior parte de nós que já andamos na indústria à algum tempo passamos a desenvolver em Web. A primeira impressão que tive de WPF/E também ajudou. Até agora, foi a sessão de que mais gostei. :-) A ver vamos o que o dia de hoje me reserva.
Já agora, aqui vai a lista das sessões a que realmente fui:
KEY001, DEV002, DEV006, e ARC002
Depois do TechDays acabar às 19, ainda fui a uma reunião do GASP, com o Chad Hower sobre o tema de "User Interface Design". Foi interessante poder verificar os diferentes pontos de vista de todos os participantes. O Chad tem umas ideias interessantes sobre o futuro da tecnologia XAML e C# que, se realmente se vier a verificar, vai tornar a nossa vida muito mais interessante.
Esperem mais notícias hoje à noite.
- A minha agenda no TechDays
-
Tenho andado a escolher a minha agenda de sessões do TechDays, e acho que já cheguei a uma versão final. Ainda me falta decidir sobre dois slots, onde tenho 2 sessões marcadas, mas já não deve mudar muito.
Os links levam-vos para o site "myTechDays", que nos permite a gestão mais "automatizada" das sessões.
Espero que todos vós estejam no TechDays, já amanhã. ;-)
- Sessão TechDays - DEV021
-
Mais uma vez vou apresentar uma sessão no evento TechDays deste ano. Mas não o vou fazer sozinho, pois vou contar com a ajuda do Paulo Morgado, um colega do GASP.
Para quem for mais distraído, aqui fica uma sinopse da sessão.
DEV021 Composite Applications: WebClient Software Factory & SmartClient Software Factory
Sérgio Amendoeira,Paulo Morgado
Dia 22, 11:15 Sala A8
O
conceito de Software Factories já existe há algum tempo. Começam agora
a aparecer as ferramentas que permitem realizar parte desta visão, tais
como as que vão ser apresentadas nesta sessão: a Smart Client Software
Factory (SCSF), e a Web Client Software Factory (WCSF) são duas
implementações recentes da equipa de Patterns and Practices que vão ser
demonstradas nesta sessão. Além da apresentação das referidas Software
Factories, serão demonstradas algumas das inúmeras capacidades dos
blocos aplicacionais sobre os quais assentam.
Na próxima semana, esperem mais alguns posts sobre o SCSF e o CAB, já que vou estar a efectuar as demos para o referido evento. :-)
- Conteúdos “Custom” em Sharepoint 2007
-
Aqui à umas semanas, tive de tranferir conteúdos "custom" de um site interno da minha empresa para uma nova versão do mesmo, utilizando o Sharepoint 2007 num período de tempo muito limitado.
Não foi fácil arranjar alternativas realizáveis em pouco tempo para o fazer. Comecei por olhar para o Business Data Catalog, e se seria possível utilizá-lo para construir listas e páginas com Web Parts indo buscar informação à Base de Dados original. Quando comecei a ver que seria necessário aprender uma linguagem de Xml para importar os dados, comecei a desesperar. Não tinha tempo para andar com experiências e testes para aprender esta linguagem. Felizmente, dei de caras com o BDC MetaMan, que podem encontrar neste link, que permite a geração, com um interface bastante amigável, do xml necessário para incluir dentro do Business Data Catalog (BDC) do Sharepoint 2007 informação de uma variedade de fontes.
Comecei a animar, até perceber que, apesar de ser uma boa fonte de informação para apresentar no Sharepoint, a actualização e inserção de registos através do BDC era bastante complexa.
Lá comecei à procura de outras alternativas. Comecei por tentar construir páginas que pudesse inserir na directoria _layouts do Sharepoint, e, efectivamente, é possível desenhar páginas que faziam o que eu necessitava. Mas, estando dentro da zona de _layouts, estas páginas perdiam todo o contexto do site onde se encontravam inseridas, e a integração com o Sharepoint e todas as suas capacidades ficavam perdidas para estas páginas.
Ok. Mais um beco sem saída. Vamos lá tentar desenhar umas WebParts com o Visual Studio 2005 que possam ser inseridas em páginas de Sharepoint. Comecei a ler o que era necessário para construir WebParts "custom"... Mas quando descobri que o único método para definição de "custom" WebParts é através de um override de um método que recebe um HTMLWriter para onde deve ser escrito todo o conteúdo html da mesma... Bem.. Considerando que eu precisava de controlos de PostBack e Eventos e Botões para implementar toda a lógica das WebParts, parti à procura de uma solução melhor.
Então, encontrei um blog post, que falava duma WebPart chamada "Son of Smart Part". Permitia fazer o host de qualquer User Control desenvolvido em ASP.Net numa WebPart de um site de Sharepoint. Encontrada esta primeira referência, comecei a ver alguma luz no fim do túnel.
Efectuei o download e comecei a explorar a ferramenta. Instalei e fiz uns testes. Pois bem, consegui, com mínimo esforço, transportar as páginas originais para User Controls e inseri-las em páginas do site Sharepoint final.
Mas mesmo assim, houve coisas que me decepcionaram. A falta de documentação da dita Web Part fez-me fugir de utilizar o método normal da utilização de WebPart connections para passar informação entre as minhas diferentes WebParts (3 no total, em cada página), e acabei por utilizar a QueryString da página onde estes User Controls iam ficar para fazer esta comunicação.
E aqui está.. Para WebParts simples que queiram desenvolver para sites Sharepoint, o "Son of Smart Part" é para vocês. Talvez com mais algum tempo surja mais documentação para que consiga utilizar as WebPart Connections para efectuar a comunicação entre as WebParts.
Entretanto, se tiveram de fazer o mesmo, ou se sabem de outra possível solução para este tipo de problema, deixem-me um comentário. Estou sempre aberto a novas soluções para problemas, mesmo que já resolvidos (apesar de não da melhor maneira).
- I am alive. :-)
-
Bem vindos ao meu blog. Espero que as minhas dificuldades em resolver os problemas do dia a dia profissional vos ajudem a não cometer os mesmos erros, e aprender com as minhas experiências.
Fiquem atentos. E se tiverem alguma questão, não hesitem em perguntar.