Salvar alterações do GridView
Olá conforme dito, formatei minha maquina e instalei o Visual Studi 2008. Funcionando 100%.
Entao, fiz um GriedViwe correto da seguinte forma ...
Public Function Rota(ByVal TipoEmpresa As String, ByVal Mes As String, ByVal Ano As String) As System.Data.DataTable
Dim objConexao As System.Data.SqlClient.SqlConnection = Nothing
Dim objCommand As System.Data.SqlClient.SqlCommand = Nothing
Dim objDtTable As System.Data.DataTable = Nothing
Dim objAdapter As System.Data.SqlClient.SqlDataAdapter = Nothing
'Cria Conexao
objConexao = New System.Data.SqlClient.SqlConnection(My.Settings.MargemConnectionString)
objDtTable = New System.Data.DataTable("")
'Abre Conexao
objConexao.Open()
'Comando a ser Executado + a Conexao
objCommand = New System.Data.SqlClient.SqlCommand("SELECT * FROM RotaCliente WHERE TipoEmpresa = 'Cadam' AND MesReferencia = '" & Mes & "' AND AnoReferencia = ' " & Ano & " '", objConexao)
'Usando o Adaptador Para o comando
objAdapter = New System.Data.SqlClient.SqlDataAdapter(objCommand)
'Preenchenco o DataTable com o Adaptador
objAdapter.Fill(objDtTable)
'Fecha Conexao
objConexao.Close()
Return objDtTable
End Function
Aí os dados sao exibidos no Grid normamelte assim:
Dim selecionaRota As Margem.AcessoRelacionamentos.Relacinamentos = Nothing
selecionaRota = New Margem.AcessoRelacionamentos.Relacinamentos
DataGridView1.DataSource = selecionaRota.Rota(cmbTipoEmpresa.Text.ToString, cmbMes.Text.ToString, cmbAno.Text.ToString)
Ok ??? Agora a dúvida ...
Como que eu modifico um valor do grid e depois mando salvar ? qual seria a logica para isso ??
Felipe.
Curtidas 0
Respostas
Luiz Maia
09/02/2009
Olá Felipe,
Agora que você já tem os dados populados na sua GridView, você precisa ter uma coluna com um botão de edição, segue abaixo uma sugestão, repare nas duas ultimas colunas da Grid que possuem imagebuttons, uma para edição e outr para exclusão.
<asp:GridView ID="gvDados" runat="server" AutoGenerateColumns="False" DataKeyNames="codfiscal" OnRowDataBound="gvDados_RowDataBound" AllowPaging="True" OnPageIndexChanging="gvDados_PageIndexChanging">
<Columns>
<asp:BoundField DataField="numGtd" HeaderText="Número" />
<asp:BoundField DataField="nomDocum" HeaderText="Tipo" />
<asp:TemplateField HeaderText="Alterar" SortExpression="codGtd">
<ItemStyle HorizontalAlign="Center" />
<HeaderStyle HorizontalAlign="Center" Width="1px" />
<ItemTemplate>
<asp:ImageButton ID="ibAlterar" runat="server" CausesValidation="False" ImageUrl="~/Images/btn_alterar.gif"
OnCommand="Alterar" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Excluir" ShowHeader="False">
<ItemStyle HorizontalAlign="Center" />
<HeaderStyle HorizontalAlign="Center" Width="1px" />
<ItemTemplate>
<asp:ImageButton ID="ibExcluir" runat="server" CausesValidation="False" ImageUrl="~/Images/btn_excluir.gif"
OnClientClick="javascript:return ConfirmaExclusao('esta GTD');" OnCommand="Excluir" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerStyle Font-Bold="True" ForeColor="White" />
</asp:GridView>
No evento RowDataBound do GridView, vc coloca os commadsArguments para os itens que deseja editar:
protected void gvDados_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string codItem = Convert.ToString(DataBinder.Eval(e.Row.DataItem, "codGtd"));
ImageButton ibAlterar = e.Row.FindControl("ibAlterar") as ImageButton;
ImageButton ibExcluir = e.Row.FindControl("ibExcluir") as ImageButton;
ibExcluir.CommandArgument = codItem;
ibAlterar.CommandArgument = codItem;}
}
E aqui você chama o método que precisa:
protected void Alterar(object sender, CommandEventArgs e)
{
int codItem = Convert.ToInt32("0" + e.CommandArgument);
EditarItem(codItem);
}
Note que o metodo acima é invocado no GridView na coluna Alterar.
Agora é só usar um Panel, por exemplo, e mandar as informações que vc deve recuperar na base para os controles dentro dele, já que vc já tem o ID do registro que deseja alterar. Pode usar a própria parte de cadastro.
Caso não entenda algum passo, me avise.
Aguardo seu retorno.
Abraços
Att
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
Por favor me de a resposta em WINDOWS FORMS
Tenho um formulario co um GridView alimentado pelo banco de dados SQL SERVER.
Abaixo tenho um botao, Excluir.
Ai no Evento Click do botao Excluir, preciso receber o Campo (id) da linha selecionada.
O id eh um campo do banco de dados, que também esta sendo exibido no Grid.
Como faço isso ?
Tentei isso mas nao deu ...
vID = DataGridView1.Rows(e.RowIndex).Cells("id").value.ToString
ta faldno que o e.RowIndex nao eh membro de of System Argnts
GOSTEI 0
Luiz Maia
09/02/2009
Olá Felipe,
Para Windows Forms, o processo é totalmente diferente, achei que queria para uma Aplicação Web, já que tinha me dito que era um GridView e não um DataFGridView, que são controles diferentes.
Fiz uma pequena aplicação e dei uns prints da mesma, segue abaixo com as devidas explicações:
Veja que criu uma coluna que chama editar, que possui um elemento DataGridViewLinkColmun, do qual eu setei o DataPropertyName com o ID do registro que quero selecionar.
Acima, veja que uso o evento CellContentClick para pegar o valor do ID do qual cliquei na coluna Editar.
Logo abaixo da grid, coloquei uma Label que jogo o valor da coluna/linha que cliquei.
Espero que ajude.
Aguardo seu retorno.
Abraços
Att
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
Éntão eh quase Isso....
Na verda preciso passar de um form pro outro como esta na figura abaixo. Pois se clicar em Alterar, aí terei que carregar todos os dados novamente em um novo Form, por isso preciso que o ID seja passada para esse novo Form.
A mesma coisa acontece no caso do Excluir. Olha se vc consegue entender.
GOSTEI 0
Luiz Maia
09/02/2009
Felipe,
Então é exatamente o que te expliquei acima, só que no momento que eu jogo o valor para Label, ao inves de jogar para uma Label, vc vai chamar um evento que abri outro Form para a edição, passando como parametro o ID do regitro selecionado.
Caso queira, de uma olhada nesta video-aula, pode te esclarecer bastante coisa
https://www.devmedia.com.br/articles/viewcomp.asp?comp=5140
https://www.devmedia.com.br/articles/viewcomp.asp?comp=5222
Se vc nao tem acesso, por favor me avise que providencio para vc gratuitamente.
Att,
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
Entao se eu colocar o label no mesmo formulario da grid e acionar pelo evento CellClick eu até consegui assim oh..
Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
Label4.Text = DataGridView1.Rows(e.RowIndex).Cells("idRota").Value.ToString()
End Sub
Mas ... eu quero passar "DataGridView1.Rows(e.RowIndex).Cells("idRota").Value.ToString()" para o forumulario que vai aparecer quando clicar no botao Excluir por exemplo.
Dessa forma eu nao consegui.
GOSTEI 0
Felipe.
09/02/2009
Acho que sei pq, olha so ...
no evento CellClick o parametro "e" eh assim ...
Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
e no evento click no botao o parametro "e" eh assim
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Por isso nao consigo acessar o
e.RowIndex).Cells("Nome").Value.ToString() no evento click no botao.
Como faça isso ?
compreendeu ?
GOSTEI 0
Luiz Maia
09/02/2009
Felipe,
Então sua dúvida é como "Trafegar parametros entre formularios", certo?
Aguardo
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
correto ...
GOSTEI 0
Luiz Maia
09/02/2009
Felipe,
Por favor me explique o fluxo do processo.
Veja se entendi:
Vc popula a grid com os dados da base
Vc escolhe um registro para ser excluido (mas como? tem um botao? checkbox? o seleciona a linha?)
Caso seja um botao, tem um botao para cada registro?
Quando clicar no botao, vc chama outro Form passando o ID do registro clicado?
Aguardo
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
Vc popula a grid com os dados da base
SIM
Vc escolhe um registro para ser excluido (mas como? tem um botao? checkbox? o seleciona a linha?)
eu clico na Linha que quero Alterar/Excluir.
Caso seja um botao, tem um botao para cada registro?
Nao, o botao fica em baixo do gridview, aí quero que quando eu selecionar um registro do grid, e apertar o botao Excluir, o ID seja passado para o novo form que vai aparecer
Quando clicar no botao, vc chama outro Form passando o ID do registro clicado?
SIM, chamo outro FORM. A dúvida eh exatamente essa, receber o ID (nesse novo form'), do grid do form anterior ...
Como demostrei na imagem que te mandei ...
GOSTEI 0
Luiz Maia
09/02/2009
Felipe,
Segue a solução para passagem de parametros:
No form 1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public int codId;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'dataSet1.SMSE016D' table. You can move, or remove it, as needed.
this.sMSE016DTableAdapter.Fill(this.dataSet1.SMSE016D);
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
label1.Text = dataGridView1[0, e.RowIndex].Value.ToString();
codId = Convert.ToInt32(dataGridView1[0, e.RowIndex].Value);
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(codId);
f2.ShowDialog();
}
e no form 2:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form2 : Form
{
public Form2(int codID)
{
InitializeComponent();
label1.Text = codID.ToString();
}
}
}
Abraços
Att
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
vc usou uma variavel Global neh ???
Eh a unica forma de passar parametros ??
Pois eu tava pensando que teria alguma forma, de ser parecido como era no ASP. onde vc cloca o url.asp?para=1¶m2=2¶3=3 ....
e pra receber seria
vParam1 = Request.Form("param1")
Isso era no ASP neh, sei que no VB.NET eh diferente ... mas com essa lógica acima existe alguma maneira ??
GOSTEI 0
Luiz Maia
09/02/2009
Felipe,
É impossivel usar via querystring como no ASP 3 e tb no ASPX, pois estamos falando de aplicação windows, se fosse uma aplicação web, teria condições sim.
Outra forma de fazer é vc usar propriedades, ou seja vc tera que criar uma classe e jogar o valor para esta classe usando get e set, assim vc faz a instancia da classe nos Forms e recupera o valor, mas o exemplo que te dei é o mais aconselhavel e usado tb, pois vc tem apenas que passar na chamada do metodo do outro Form que vc deseja usar.
Abraços
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
Sei que só serveria no ASP.NET, só exemplifiquei pra saber em que ponto quero chegar.
Então, quanto a criação da classe e o instaciamento não seria o problema, muito menos na chamada.
O problema eh que nao sei como usar essas propriedades... Pode medar um exmplo simples ???
Tipo Assim
FormOrigem:
FormOrigem.Set("nomeParametro")=idDoGridView
FormDestino
x = FormDestino.Get("nomeParametro")
creio que seja algo parecido com isso neh ??? Pode me ajudar ?!
GOSTEI 0
Luiz Maia
09/02/2009
Felipe,
A outra forma de fazer é passar todo o Form (que á uma classe) como parametro, assim vc tem todos os controles do From1 no Form2, veja abaxio o codigo do Form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
//atributo
private int cod_id;
// propriedades
public int CodigoId
{
get { return cod_id; }
set { cod_id = value; }
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// TODO: This line of code loads data into the 'dataSet1.SMSE016D' table. You can move, or remove it, as needed.
this.sMSE016DTableAdapter.Fill(this.dataSet1.SMSE016D);
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
label1.Text = dataGridView1[0, e.RowIndex].Value.ToString();
this.CodigoId = Convert.ToInt32(dataGridView1[0, e.RowIndex].Value);
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2(this);
f2.ShowDialog();
}
}
}
Agora o Form2:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form2 : Form
{
public Form2(Form1 f1)
{
InitializeComponent();
label1.Text = f1.CodigoId.ToString();
}
}
}
Abraços
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
Agora so uma coisa ...
como consigo acessar o evento ... "E" em um eventoONCLICK ...
pq no Onclick o E eh do tipo SystemArgunsts, wu nao consigo acesso os ColumIndex.
Label4.Text = DataGridView1(e.ColumnIndex, e.RowIndex).Value.ToString()
GOSTEI 0
Luiz Maia
09/02/2009
Não tem jeito, o "e" - argumento da assinatura do metodo - faz parte de contextos diferentes, uma coisa é o "e" do evento da DataGridView e outra coisa é o "e" do evento do botão.
Att
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
Então a única forma de se passar o parametro no ONCLICK seria usando a variavel global ?
GOSTEI 0
Luiz Maia
09/02/2009
Sim, lembrando que vc consegue ver todos os controles do Form1 através do Form2, por que passamos o Form1 como parametro para o Form2. Com isto vc pode acessar qualquer variavel setada no Form1, caso ela seja Global no Form1.
Abraços
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
Consegui passar os valores, pelo metodo GET e SET, depois de muuuita luta. MAS CONSEGUI :-)
Agora a dúvida eh, como populo um combobox com dados do banco de dados.
Se possivel em VB.NET .. apesar de ser bem parecido com C#, o VB tem um sintaxe 'mais limpa' e clara.
GOSTEI 0
Luiz Maia
09/02/2009
Felipe,
Como o contexto do chamado foi alterado e conseguimos chegar na solução que vc queria, eu devo proceder com o fechamento deste chamado e vc deve abrir outro, ok?
Aguardo seu novo chamado.
Abraços
Att
Luiz Maia
GOSTEI 0
Felipe.
09/02/2009
OK Entao.
GOSTEI 0