Quando estamos usando o footer da gridview como meio para inserir novos registros na gridview ficamos com um problema quando a lista está vazia, pois desse jeito a gridview não é exibida e logo não tem como fazer a inserção. Estou mostrando uma pequena solução para resolver esse problema, não é das mais bonitas, mas é bem simples e pelo o que andei pesquisando essa solução e a outra de extender a classe gridview são as mais usadas, sendo que a segunda requer um pouco mais de trabalho.

// A lista está vazia
            if (vetProduto.Count == 0)
            {
// Instancio uma nova lista do mesmo tipo do objeto presente na gridview 
                List<Produto> ls = new List<Produto>();
// Instancio e adiciono na lista um produto
                ls.Add(new Produto());
// Faço o bindign
                grid.DataSource = ls;
                grid.DataBind();                
// Obter o número de celulas da gridview
                int columnSpan = grid.Rows[0].Cells.Count;
// Apaga todo o conteudo da primeira linha
                grid.Rows[0].Cells.Clear();
// Adiciona uma nova celula
                grid.Rows[0].Cells.Add(new TableCell());
// Faz o conteudo da celula ficar centralizado
                grid.Rows[0].Attributes.CssStyle.Add("text-align", "center");
// Adiciona uma frase informativa
                grid.Rows[0].Cells[0].Text = "Não existe nenhum produto cadastrado.";
// Coloca a celula para ocupar todo o espaço da tabela
                grid.Rows[0].Cells[0].ColumnSpan = columnSpan;                
            }
            else
            {
// A lista nao estava vazia, logo trata normalmente
                grid.DataSource = vetProduto;
                grid.DataBind();
            }

Anúncios

Uma das técnicas que tem mais sido usadas é a edição in-line do gridview e o comum de se encontrar é utilizar a última linha da gridview com os campos para inserção, porém se você utilizar o commandfield para adicionar os linkbutton pode dar um pouco de dor de cabeça para conseguir deixar um layout legal.

O resultado que esperamos conseguir é algo nesse estilo:

aspx

        <asp:GridView 
            ID="grid1" 
            runat="server"                
            ShowFooter="true"   
            OnRowDataBound="gvRow"                                         
        >
        <Columns>
              <asp:CommandField 
                    HeaderText="Opções" 
                    EditText="Editar"                                                            
                    UpdateText="Salvar"
                    ShowEditButton="true"
                    CancelText="Cancelar"
                    ShowCancelButton="true"
                    DeleteText="Excluir"
                    ShowDeleteButton="true"                                           
                    FooterText="Inserir"                                                    
            /> 
        protected void gvRow(object sender, GridViewRowEventArgs e)
        {
           //Verifica se é o rodapé
            if (e.Row.RowType.Equals(DataControlRowType.Footer))
            {
                // Deixando o linkbutton centralizado
                e.Row.Cells[0].Style.Add("text-align", "center");
                // Instanciando o linkbutton
                LinkButton lb = new LinkButton();
                lb.Text = "Inserir";
                // Registrando o evento
                lb.Click += new EventHandler(gvSistemasInserir);             
                // Adicionando a celula
                e.Row.Cells[0].Controls.Add(lb);
            }
        }

Bem, o que basicamente fizemos foi no evento de RowDataBound, verificar quando se está no rodapé e adicionar na primeira célula o link de Inserir, é um método meio “porco” mas funciona e no momento meu lema é “Funcionou, tá certo”

Post migrado em:

http://programatik.soucafecomleite.com.br/gridview-excluir-js