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.

20 10:00 People Ready KEY001 Sala A1

12:00 .NET 3.0 - Plataforma de Desenvolvimento DEV001 Sala A1

14:15 The Microsoft Web Story: ASP.NET 2.0, ASP.NET AJAX, and WPF/E DEV002 Sala A1

16:00 Windows Presentation Foundation I DEV006 Sala A8

17:45 Windows PowerShell (nome de código anterior "Monad"): A Próxima Geração de Command Line Scripting MGT004 Sala A3
21 09:30 ASP.NET AJAX DEV009 Sala A7


The Social Life Of Information (TSLOI) - Part 1/3 - Collaboration ARC003 Sala A2

11:15 C# 3.0 Futuras Direcções e Inovações na Linguagem DEV011 Sala A2


The Social Life Of Information (TSLOI) - Part 2/3 - Search ARC004 Sala A3

13:30 The Social Life Of Information (TSLOI) - Part 3/3 - Workflows, Forms and Excel Services ARC005 Sala A3

15:15 Creating Rich 2D 3D content with WPF DEVHOL12 Sala S1.05

17:00 SaaS: Software as a Service, Desafios e Oportunidades ARC006 Sala A7
22 09:30 As Angústias de um Arquitecto ARC007 Sala A6

11:15 Composite Applications: WebClient Software Factory & SmartClient Software Factory DEV021 Sala A8

13:30 LINQ - .NET Language Integrated Query (LINQ) Framework DEV027 Sala A8

15:15 Patterns & Practices: Enterprise Library 3.0 DEV028 Sala A8

17:00 Team System - Metodologias Ágeis & Conceitos: SCRUM, MSF, XP ARC009 Sala A6

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.

Posted 05 March 07 09:21 by Sérgio Amendoeira | 0 Comments   
Filed under