none
Ao altera a celula! RRS feed

  • Pergunta

  • Amigos,

    Boa noite.

    Seguinte, no meu datagrid tenho uma coluna chamada "VALOR TOTAL", onde o objetivo é: ao alterar oconteudo desta coluna preciso fazer algumas atualizações de registros no banco de dados. A minha duvida é:

    Preciso recuperar o valor da celula antes de altera-la e o valor depois de altera-la.

    Sendo que preciso colocar uma msg de confirmação perguntando se o usuario confirma a alteração!

    E preciso tb saber se nesse codigo eu consigo fazer uma conexão e alteraçãoes de dados normalmente(isso eu sei fazer).

    segue abaixo o codigo!

    no meu load eu coloquei

    AddHandler ds.Tables("tbl_despesas").RowChanged, AddressOf
    DataTable_RowChanged

    e depois criei a sub

    Private Sub DataTable_RowChanged(ByVal sender As Object, ByVal e As
    DataRowChangeEventArgs)
            If dg.CurrentCell.ColumnNumber = 4 Then
                If MessageBox.Show("CONFIRMA A ALTERAÇÃO DO VALOR TOTAL?"
    & vbCrLf & "ESTA ALTERAÇÃO AFETARA O VALOR DAS PARCELAS", vtitulo,
    MessageBoxButtons.YesNo, MessageBoxIcon.Information,
    MessageBoxDefaultButton.Button2) = DialogResult.Yes Then

                Else

                End If
            End If
        End Sub

    sacou?

    utilizo VS 2003! (vb.net)

    abraços!!

    domingo, 14 de maio de 2006 23:16

Respostas

  • Fernando,

    Ah, foi mal, me esqueci que você está usando o ColumnChanging. Como você atribue valor para a coluna ele dispara o evento de novo, num loop. Foi mal. Bom, use o a propriedade ProposedValue do argumento e neste caso:

    Dim drv As DataRowView = DirectCast(Me.BindingContext(seuDataSet.Tables("SuaTabela")).Current, DataRowView)
    e.ProposedValue = drv.Row(
    "Campo", DataRowVersion.Original)

    Abraços,
    Francisco

    terça-feira, 16 de maio de 2006 18:12
    Moderador
  • Fernando,

    O e.ProposedValue entra no método com o valor que o usuário informou. Você pode usá-lo no sim.

    Abraços,
    Francisco
    Ok,Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    terça-feira, 16 de maio de 2006 19:40
    Moderador

Todas as Respostas

  • Pessoal,

     

    alguem tem alguma idéia??

    estou a duas semanas procurando uma solução e não encontro nada...

     

    abraços!

    segunda-feira, 15 de maio de 2006 12:33
  • Fernando,

    Tem um exemplo no meu blog próximo a isso:

    http://h1.ripway.com/fbcjunior/blog/DataGridUpdate.zip

    Eu uso o evento ColumnChanged do DataTable associado ao DataGrid para salvar a cada alteração de dado no DataGrid, você só teria que incluir sua lógica aí no processo.

    Espero que ajude,

    Abraços,
    Francisco

     

    terça-feira, 16 de maio de 2006 10:57
    Moderador
  • Francisco,

    consegui fazer uma coisa..porém só falta um aperfeiçoamento.

    segue o que eu fiz...

    If dg.CurrentCell.ColumnNumber = 4 Then

    If MessageBox.Show("CONFIRMA A ALTERAÇÃO DO VALOR TOTAL?" & vbCrLf & "ESTA ALTERAÇÃO AFETARA O VALOR DAS PARCELAS", vtitulo, MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2) = DialogResult.Yes Then

    Dim conalt As New OleDb.OleDbConnection(vconex)

    vcom = "DELETE * from tbl_parcelas WHERE id_despesa = " & dg(dg.CurrentCell.RowNumber, 0)

    Dim sqla As New OleDb.OleDbCommand

    sqla = conalt.CreateCommand()

    sqla.CommandText = vcom

    conalt.Open()

    sqla.ExecuteNonQuery()

    conalt.Close()

    vcom = "insert into tbl_parcelas (id_despesa) VALUES (" & dg(dg.CurrentCell.RowNumber, 0) & ")"

    sqla = conalt.CreateCommand()

    sqla.CommandText = vcom

    conalt.Open()

    sqla.ExecuteNonQuery()

    conalt.Close()

    MessageBox.Show("PARCELAS ALTERADAS!", vtitulo, MessageBoxButtons.OK, MessageBoxIcon.Information)

    Else

     

     

    End If

    End If

     

    ta funcionando certinho...porém...não to sabendo como fazer para manter o valor original caso o usuário clique em "não" da mensagem! Preciso colocar alino depois do ELSE algo que volte o valor original da celula!

     

    abraços!

    terça-feira, 16 de maio de 2006 17:32
  • Fernando, para declinar, chame o método RejectChanges do seu DataTable que é origem do Grid.
    terça-feira, 16 de maio de 2006 17:44
    Moderador
  • Fernando,

    Você pode obter o valor do próprio DataTable. Como você está vinculando seu DataGridView a coleção?

    Por exemplo, se você vincular sua coleção assim:

    SeuDataGridView.DataSource = seuDataSet.Tables("SuaTabela")

    Você chegaria ao valor original do campo assim:

    Dim drv As DataRowView = DirectCast(Me.BindingContext(ds.Tables("SuaTabela")).Current, DataRowView)
    MessageBox.Show(drv.Row(
    "NomeDoCampo", DataRowVersion.Original))

    Outra coisa, talvez você não precise nem setar o valor, você poderia simplesmente cancelar a edição:

    Me.BindingContext(ds.Tables("SuaTabela")).CancelCurrentEdit()

    Os exemplos acima funcionariam se a vinculação for feita da forma como demonstrei lá em cima, do contrário poste como você está fazendo para eu lhe mostrar o que é possível.

    Abraços,
    Francisco


     

    terça-feira, 16 de maio de 2006 17:48
    Moderador
  • Francisco,

    fiz assim

    Dim drv As DataRowView = DirectCast(Me.BindingContext(ds.Tables("tbl_despesas")).Current, DataRowView)

    dg(dg.CurrentCell.RowNumber, 4) = drv.Row("valortotal", DataRowVersion.Original)

    porém acontece que ele fica em um loop maluco...eu clico em não..e fica aparecendo a mensagem de confirmação até que eu clique em "SIM"..

     

    eu monto o meu datagrid da seguinte forma:

     

    Dim tableStyle As New DataGridTableStyle
    Dim column As New DataGridTextBoxColumn

    opcoes.Enabled = False

    'tableStyle.MappingName = "tbl_despesas"

    With tableStyle

    .AlternatingBackColor = Color.White

    .BackColor = Color.Cornsilk

    '.ForeColor = Color.MidnightBlue

    '.GridLineColor = Color.RoyalBlue

    '.HeaderBackColor = Color.MidnightBlue

    .HeaderFont = New Font("Arial", 8.0!, FontStyle.Bold)

    '.HeaderForeColor = Color.Lavender

    '.SelectionBackColor = Color.Teal

    '.SelectionForeColor = Color.PaleGreen

    .MappingName = "tbl_despesas"

    '.PreferredColumnWidth = 125

    .PreferredRowHeight = 15

    End With

    column.MappingName = "id_despesa"

    column.HeaderText = "CÓD."

    column.Width = 35

    column.ReadOnly = True

    tableStyle.GridColumnStyles.Add(column)

    column = New DataGridTextBoxColumn

    column.MappingName = "despesa"

    column.HeaderText = "DESPESA"

    column.Width = 120

    tableStyle.GridColumnStyles.Add(column)

    Dim cons As New OleDb.OleDbConnection(vconex)

    Dim das As New OleDb.OleDbDataAdapter("Select * from tbl_situacoes", cons)

    Dim dss As New DataSet

    Dim cbs As New DataGridComboBoxColumn

    cbs.MappingName = "id_situacao"

    cbs.HeaderText = "SITUAÇÃO"

    das.Fill(dss, "tbl_situacoes")

    cbs.Width = 100

    cbs.myComboBox.DisplayMember = "situacao"

    cbs.myComboBox.ValueMember = "id_situacao"

    cbs.myComboBox.DataSource = dss.Tables("tbl_situacoes").DefaultView

    tableStyle.GridColumnStyles.Add(cbs)

    Dim conc As New OleDb.OleDbConnection(vconex)

    Dim dac As New OleDb.OleDbDataAdapter("Select * from tbl_credores", conc)

    Dim dsc As New DataSet

    Dim cbo As New DataGridComboBoxColumn

    cbo.MappingName = "id_credor"

    cbo.HeaderText = "CREDOR"

    dac.Fill(dsc, "tbl_credores")

    cbo.Width = 200

    cbo.myComboBox.DisplayMember = "nome"

    cbo.myComboBox.ValueMember = "id_credor"

    cbo.myComboBox.DataSource = dsc.Tables("tbl_credores").DefaultView

    tableStyle.GridColumnStyles.Add(cbo)

    column = New DataGridTextBoxColumn

    column.MappingName = "valortotal"

    column.HeaderText = "TOTAL"

    column.Alignment = HorizontalAlignment.Center

    column.Width = 50

    tableStyle.GridColumnStyles.Add(column)

    column = New DataGridTextBoxColumn

    column.MappingName = "nparcelas"

    column.HeaderText = "PARC."

    column.Alignment = HorizontalAlignment.Center

    column.Width = 38

    tableStyle.GridColumnStyles.Add(column)

    column = New DataGridTextBoxColumn

    column.MappingName = "data"

    column.HeaderText = "DATA"

    column.Alignment = HorizontalAlignment.Center

    column.Width = 70

    tableStyle.GridColumnStyles.Add(column)

    'Dim c As New DataGridBoolColumn

    'c.MappingName = "quitado"

    'c.HeaderText = "QUITADO"

    'c.AllowNull = False

    'c.TrueValue = 1

    'c.FalseValue = 0

    'c.Width = 60

    'tableStyle.GridColumnStyles.Add(c)

    column = New DataGridTextBoxColumn

    column.MappingName = "descricao"

    column.HeaderText = "DESCRIÇÃO DA DESPESA"

    column.Width = 500

    tableStyle.GridColumnStyles.Add(column)

    dg.TableStyles.Add(tableStyle)

    vcom = "SELECT tbl_despesas.id_situacao,tbl_despesas.nparcelas,tbl_despesas.id_credor,tbl_despesas.id_despesa, tbl_despesas.despesa, tbl_despesas.descricao, tbl_credores.nome, tbl_despesas.data, tbl_despesas.valortotal FROM (tbl_credores INNER JOIN tbl_despesas ON tbl_credores.id_credor = tbl_despesas.id_credor) INNER JOIN tbl_usuarios ON tbl_despesas.id_usuario = tbl_usuarios.id_usuario WHERE tbl_usuarios.id_usuario=" & viduser

    con.Open()

    da = New OleDb.OleDbDataAdapter(vcom, con)

    ds = New DataSet

    da.Fill(ds, "tbl_despesas")

    ds.Tables("tbl_despesas").Columns("id_despesa").DefaultValue = 0

    ds.Tables("tbl_despesas").Columns("despesa").DefaultValue = ""

    ds.Tables("tbl_despesas").Columns("descricao").DefaultValue = ""

    ds.Tables("tbl_despesas").Columns("id_situacao").DefaultValue = 1

    ds.Tables("tbl_despesas").Columns("id_credor").DefaultValue = 1

    ds.Tables("tbl_despesas").Columns("data").DefaultValue = DateTime.Now.ToString("dd/MM/yyyy")

    ds.Tables("tbl_despesas").Columns("valortotal").DefaultValue = "0,0"

    ds.Tables("tbl_despesas").Columns("nparcelas").DefaultValue = 1

    ds.Tables("tbl_despesas").DefaultView.AllowDelete = False

    dg.DataSource = ds.Tables("tbl_despesas")

    AddHandler ds.Tables("tbl_despesas").ColumnChanging, AddressOf DataTable_ColumnChanging

    con.Close()

     

    terça-feira, 16 de maio de 2006 17:59
  • Fernando,

    Ah, foi mal, me esqueci que você está usando o ColumnChanging. Como você atribue valor para a coluna ele dispara o evento de novo, num loop. Foi mal. Bom, use o a propriedade ProposedValue do argumento e neste caso:

    Dim drv As DataRowView = DirectCast(Me.BindingContext(seuDataSet.Tables("SuaTabela")).Current, DataRowView)
    e.ProposedValue = drv.Row(
    "Campo", DataRowVersion.Original)

    Abraços,
    Francisco

    terça-feira, 16 de maio de 2006 18:12
    Moderador
  • Perfeito como sempre francisco.

     

    abraços!

    terça-feira, 16 de maio de 2006 18:48
  • Francisco,

    seguinte cara...encontrei um problema aqui.

    O codigo funcionou legal..para quando eu Clico em "NÂO".

    Quando eu clico em "SIM"..eu preciso pegar o valor que inserido, ou seja eu preciso do valor que foi alterado...e não mais do valor original!

    como posso fazer isso?

     

    abraços!

     

     

    terça-feira, 16 de maio de 2006 19:31
  • Fernando,

    O e.ProposedValue entra no método com o valor que o usuário informou. Você pode usá-lo no sim.

    Abraços,
    Francisco
    Ok,Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    terça-feira, 16 de maio de 2006 19:40
    Moderador
  • hehehe...vlw...resolvido..ou melhr..acho q sim...abraços!
    terça-feira, 16 de maio de 2006 19:46