• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

maiden

Eliminar registos de um GridView através de código

6 mensagens neste tópico

Boas,

A certa altura no meu projecto necessito que o utilizador insira uma quantidade e uma descrição para um produto e ao carregar no botão Inserir insira efectivamente essa informação introduzida (referente a um registo) num GridView. A minha ideia foi criar uma DataTable, inserir os dados introduzidos nessa mesma DataTable e por fim definir o DataSource do GridView para a DataTable (sendo essa tabela ainda tornada numa variável de sessão, de forma a passar a informação nela contida para uma espécie página de visualização). Para o efeito criei o seguinte código:

Public Function CriarTabela() As DataTable
    Dim tabela As DataTable = New DataTable()

    Dim colunaQuantidade As DataColumn
    Dim colunaDescricao As DataColumn

    colunaQuantidade = New DataColumn()
    colunaQuantidade.DataType = Type.GetType("System.Int32")
    colunaQuantidade.ColumnName = "Quantidade"
    tabela.Columns.Add(colunaQuantidade)

    colunaDescricao = New DataColumn()
    colunaDescricao.DataType = Type.GetType("System.String")
    colunaDescricao.ColumnName = "Descricao"
    tabela.Columns.Add(colunaDescricao)

    Return tabela
End Function

Public Sub AdicionarDados(ByVal quantidade As Integer, ByVal descricao As String, ByVal tabela As DataTable)

    Dim registo As DataRow
    registo = tabela.NewRow()

    registo("Quantidade") = quantidade
    registo("Descricao") = descricao

    tabela.Rows.Add(registo)

End Sub

A tabela é criada no evento Page_Load e no click do botão inserir são validados e por fim inseridos os dados nessa tabela, de forma a passarem para o GridView:

Protected Sub btnInserir_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles btnInserir.Click

    AdicionarDados(txtQuantidade.Text, txtDescricao.Text, (CType(Session("tabela"), DataTable)))

    GridView1.DataSource = (CType(Session("tabela"), DataTable).DefaultView)
    GridView1.DataBind()

    btnCheckAll.Visible = True
    btnUncheckAll.Visible = True
    btnEliminarSeleccionados.Visible = True

    txtQuantidade.Text = "Quantidade"
    txtDescricao.Text = "Descrição"

End Sub

Depois tenho umas checkboxes no inicio de cada registo do GridView que permitem seleccionar os registos a eliminar. O problema reside aqui, quer dizer, quando selecciono vários registos e mando eliminar. Quando selecciono apenas um registo ele elimina-o sem problemas, mas quando escolho 3/4 registos em simultâneo e mando eliminar dá-me um erro tipo "There's no row 2/3 in table" (não posso precisar muito bem este erro porque não está a correr aqui em casa por falta da base de dados). O código que elimina os registos é o seguinte:

Protected Sub btnEliminarSeleccionados_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles btnEliminarSeleccionados.Click

    Dim tabela As New DataTable
    tabela = CType(Session("tabela"), DataTable)

    'Percorrer registos do gridview
    Dim index As Integer
    For index = 0 To GridView1.Rows.Count - 1
        'Aceder 'as checkboxes
        Dim cb As CheckBox = CType(GridView1.Rows(index).FindControl("chkItem"), CheckBox)

        'Caso estejam checkadas
        If cb.Checked = True Then
            'Eliminar registo
            Dim row As DataRow = tabela.Rows(index)
            tabela.Rows.Remove(row)
        End If
    Next

    GridView1.DataSource = tabela
    GridView1.DataBind()

End Sub

Alguém me dá uma ajudinha?

Obrigado desde já.

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

De momento não consigo testar o código com deve ser mas faz antes assim:

       For Each row As GridViewRow In GridView1.Rows
            Dim cb As CheckBox = CType(row.FindControl("chkItem"), CheckBox)
            If cb.Checked Then
                ' Apagar aqui utilizando row.RowIndex
            End If
        Next

Diz-me se está a trabalhar ou não que eu amanhã de manhã respondo (caso não funcione é claro!)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta inverter o ciclo For, ou seja, apaga primeiro o item com o index superior. Altera o FOR para

For index = GridView1.Rows.Count - 1 To 0 Step -1

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@jpaulino

Funciona, mas continuo com o problema de passar os dados para outra página.

@Tiago Salgado

Pois, é isso mesmo. Funciona na perfeição agora.

Obrigado pela ajuda.

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Funciona, mas continuo com o problema de passar os dados para outra página.

Como te disse não experimentei! Mas já agora, por curiosidade, qual é o problema a passar dados para outra página ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tu apenas eliminaste os registos do GridView, continuando a DataTable que serve para enviar os dados para a página de pré-visualização inalterada. De qualquer das formas encontra-se já resolvido, não fazia ideia desta nuance ao eliminar registos de uma tabela. Estamos sempre a aprender ;)

Cumps,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora