Duvida DataGridView C#

Tenho um formulário de vendas. Tenho um DataGridView que quero que jogue todos os produtos que a pessoa for comprar dentro dele.
Mas quero que quando clicar no botao “adicionar produto a venda”, abra um novo formúlario que liste todos os produtos em estoque em um DataGridView tambem e tenho um campo para pesquisar o produto por codido ou nome, ai é só selecionar ou dar dois cliques no produto desejado e jogar no DataGridView do formlário de vendas.

Como faço para quando escolher o produto na lista, ele ser inserido no DataGridView do outro formulário de vendas?

[quote=Rodrigo1895]Tenho um formulário de vendas. Tenho um DataGridView que quero que jogue todos os produtos que a pessoa for comprar dentro dele.
Mas quero que quando clicar no botao “adicionar produto a venda”, abra um novo formúlario que liste todos os produtos em estoque em um DataGridView tambem e tenho um campo para pesquisar o produto por codido ou nome, ai é só selecionar ou dar dois cliques no produto desejado e jogar no DataGridView do formlário de vendas.

Como faço para quando escolher o produto na lista, ele ser inserido no DataGridView do outro formulário de vendas?[/quote]

Opa, Rodrigo1895, beleza?
Vamos com calma, muita calma, hahaha.

Para você preencher um DataGridView com conteúdo, você faz uso da propriedade DataSource.gridview.DataSource = dados;
Como você quer preenchê-lo com uma lista de produtos que a pessoa pode comprar, você carrega essa coleção e adiciona ao DataGridView.IList<Produto> produtos = new List<Produto>() { new Produto(1, "Produto 1"), new Produto(2, "Produto 2"), new Produto(3, "Produto 3") }; gridview.DataSource = produtos;

Atenção: o DataGridView possui uma propriedade chamada AutoGenerateColumns. O seu valor default é true. Com isso, se você joga aquela coleção acima na GridView, ela gera as colunas de acordo com as propriedades existentes no seu objeto. Caso você queira gerar as suas próprias colunas, mostrando somente os dados que você quiser, você seta aquela propriedade para false e usa o editor da GridView para colocar as colunas ao seu bel prazer.

[quote=Rodrigo1895]Mas quero que quando clicar no botao “adicionar produto a venda”, abra um novo formúlario que liste todos os produtos em estoque em um DataGridView tambem e tenho um campo para pesquisar o produto por codido ou nome, ai é só selecionar ou dar dois cliques no produto desejado e jogar no DataGridView do formlário de vendas.
Como faço para quando escolher o produto na lista, ele ser inserido no DataGridView do outro formulário de vendas?[/quote]
Novamente, você faz igual ao passo acima para preencher a sua GridView. Para adicionar registros na GridView, existem dois modos:

  1. Usar o método AddRow da propriedade Rows: você cria um objeto DataGridViewRow, preenche os dados de acordo com as colunas que você possui e chama o método Add da propriedade Rows DataGridViewRow row = new DataGridViewRow(); row[0].Value = "4"; row[1].Value = "Produto 4"; gridview.Rows.Add(row);
  2. Recarregar a coleção da GridView: você adiciona o objeto no banco de dados, carrega a coleção novamente e faz uso do DataSource. Eu, particularmente, só uso esse.

Para a sua pesquisa, você pode seguir os passos acima: faça uma busca com o texto a procurar e carregue a nova coleção na GridView. Para pegar o registro selecionado, há os eventos SelectedRowChanged (acho que é assim mesmo), o CellClick e o DoubleCellClick. Dê uma olhada no comportamento destes e veja qual soluciona.

Espero ter ajudado, cara,
fique com Deus! :smiley:

pelo que entendi eu teria que ir em um dos eventos que você citou( SelectedRowChanged, o CellClick e o DoubleCellClick) e dentro dele que eu vou jogar para o DataGridView que tem no formulário de vendas?

Obrigado, ajudou bastante!

Quase isso. Esses métodos servem para você pegar o objeto de uma determinada linha. Caso você selecione uma linha e dê dois cliques nela para pegar o objeto daquela linha, faça isso através do método DoubleCellClick. Caso você queira pegar ao selecionar a linha, simplesmente, use o SelectedRowChanged, e assim por diante. Depois de montar o objeto, aí sim você joga ele pra DataGridView que você quer, entendeu? Algo como:

[code]//Não sei qual é o segundo parâmetro de cabeça, é só um exemplo…
protected void gridview_DoubleCellClick(object sender, DataGridCellEventArgs args) {

// Pega a linha selecionada;
// Monta o objeto Produto de acordo com os dados nas células daquela linha;
// Aí sim você adiciona na outra GridView!
}[/code]

Como faço para atibuir um valor de um datagridview em outro datagrid view de um outro fom?

Fiz assim:

[code]
// pegar dados d eum datagridview
string codigo = estoqueDataGridView.CurrentRow.Cells[0].Value.ToString();

// preencher o outro datagridview
Form1 frm = new Form1();
frm.compras_detalhesDataGridView.Rows[0].Cells[2].Value = codigo;[/code]

Não está dando certo…
O que está errado?

Sou novato ainda!!

Ele está dando erro na linha:

O que tem de errado nessa linha?

UP

[quote=Rodrigo1895]Ele está dando erro na linha:

O que tem de errado nessa linha?[/quote]
Estou enferrujado em Windows Forms, mas tentando ajudar, qual erro é apresentado na tela ou output?

O erro apresentado é:

ArgumentOutOfRangeException was unhandled
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

O que é?

[quote=Rodrigo1895]O erro apresentado é:

ArgumentOutOfRangeException was unhandled
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

O que é?[/quote]
Provavelmente a linha zero ou célula posição 2 não existe. Debugando veja os arrays Rows e Cells para saber quantos elementos tem, pois está acessando um elemento que não existe, provavelmente terá que criá-lo se for esta a intenção.

entao…

Com esse código eu quero inserir um dado que foi pego antes:

no indice do Cell[2], dois é o campo do codproduto da tabela venda_detalhes…
O indice do Rows[] que eu não sei ao certo o que colocar, é o número da linha…
Mas nem sempre o número da linha será o mesmo, como eu faço para faze com que pegue a próxima linha depois da ultima linha exitente?

[quote=Rodrigo1895]entao…

Com esse código eu quero inserir um dado que foi pego antes:

no indice do Cell[2], dois é o campo do codproduto da tabela venda_detalhes…
O indice do Rows[] que eu não sei ao certo o que colocar, é o número da linha…
Mas nem sempre o número da linha será o mesmo, como eu faço para faze com que pegue a próxima linha depois da ultima linha exitente?[/quote]
Depende do contexto que você está, está em algum evento do DataGridView? Independente de qualquer linha for pegar, se a linha zero não existe, é porque não existe nenhuma linha neste objeto que está usando. Poste o código de forma mais completa em relação ao problema envolvido.

[quote=Rodrigo1895]Como faço para atibuir um valor de um datagridview em outro datagrid view de um outro fom?

Fiz assim:

[code]
// pegar dados d eum datagridview
string codigo = estoqueDataGridView.CurrentRow.Cells[0].Value.ToString();

// preencher o outro datagridview
Form1 frm = new Form1();
frm.compras_detalhesDataGridView.Rows[0].Cells[2].Value = codigo;[/code]

Não está dando certo…
O que está errado?

Sou novato ainda!![/quote]
Foi como eu te disse na explicação: você pega a linha selecionada na GridView e transforma em um objeto, em um array ou qualquer estrutura que você usa em sua aplicação. Depois disso, você cria um objeto DataGridViewRow, preenche suas células com os dados da sua outra GridView e, através do método Add da propriedade Rows, você adiciona uma nova linha.[code]string codigo = estoqueDataGridView.CurrentRow.Cells[0].Value.ToString();

DataGridViewRow row = new DataGridViewRow();
row[2].Value = codigo;

Form1 form = new Form1();
form.detalhesDataGridViewRow.Rows.Add(row);[/code]

OBS: tá estranhíssimo esse teu código para adicionar na nova gridview. O que você tá tentando fazer, exatamente?
Não seria melhor pegar todos as linhas selecionadas, passar uma coleção para o construtor do novo formulário e preencher sua GridView com essa coleção?

O meu objetivo é pegar o código da tabela estoque e inserir na tabela compras_detalhes na coluna do cod produto.
Eu inseri esse codigo que você me mostrou

[code] string codigo = estoqueDataGridView.CurrentRow.Cells[0].Value.ToString();

        DataGridViewRow row = new DataGridViewRow();
        row[2].Value = codigo;

        Form1 form = new Form1();
        form.compras_detalhesDataGridView.Rows.Add(row); [/code]

Ele está dando erro na linha:

Erro:
Cannot apply indexing with [] to an expression of type ‘System.Windows.Forms.DataGridViewRow’

Acho que o erro está no row[2]…
O que pode ser?

Sim, o erro provavelmente é aí. Eu só peguei o código que você colocou e refatorei. Existe a coluna 2? Você a criou?

No DataGridView a coluna existe, ela é a coluna do codproduto…
Mas eu tenho que criar a coluna nesse objeto row também?Como?

Chegando de paraquedas na thread: hey, você criou um template do seu grid nas aspx? Para não criar automaticamente em code herind?

O que eu estou fazendo é para Desktop, não estou fazendo para web…


indiferente. VOcê teria que fazer para as duas coisas