Bom dia! Gostaria da ajuda de vocês para resolver a seguinte questão: tenho um form que existe uma gridview que recebe itens. Eu preciso verificar antes de inserir o item se ele já existe na grid. Eu imagino que seja algo do tipo: percorrer as linhas da coluna em questão, e se existir o código retorna item já existente...se não faz a inserção.

Alguém poderia me ajudar com essa questão?

Agradeço por qualquer ajuda que poderem oferecer...

Obrigado!

Charles Menezes.

Exibições: 223

Respostas a este tópico

Qual é a chave para indicar "repetição" ?

Se é baseado em DB então porque não colocar uma chave primária e deixar a validação por conta do DB ?

A aplicação é o seguinte, é uma requisição onde o usuário vai inserindo itens na grid, ele pesquisa o item informa a quantidade e inseri na grid...e depois de inserir todos os itens é que salva no DB. Eu gostaria de fazer essa validade no momento que ele clica em inserir item...

Charles Menezes.

Jorge E. Hime Somers disse:

Qual é a chave para indicar "repetição" ?

Se é baseado em DB então porque não colocar uma chave primária e deixar a validação por conta do DB ?

Pelo que me lembro tem uma forma de montar um "DB" na memória com chave e tudo mais.. 

Não me lembro como mas tem como fazer.. 

Por que não usar um Dictionary ?

Charles Menezes disse:

A aplicação é o seguinte, é uma requisição onde o usuário vai inserindo itens na grid, ele pesquisa o item informa a quantidade e inseri na grid...e depois de inserir todos os itens é que salva no DB. Eu gostaria de fazer essa validade no momento que ele clica em inserir item...

Charles Menezes.

Jorge E. Hime Somers disse:

Qual é a chave para indicar "repetição" ?

Se é baseado em DB então porque não colocar uma chave primária e deixar a validação por conta do DB ?

Segue trecho do código, o que devo fazer para ele funcionar perfeitamente, pois ele até verifica com dois itens, com 3 já começa dar problema...tem alguma coisa errada no foreach....se puderem me ajudar a corrigir esse código....

Obrigado!

private void btnInserir_Click(object sender, EventArgs e)
        {

            string cod = txtCodigoSky.Text;

            if(txtQuantidade.Text == "")
            {
                MessageBox.Show("Digite a Quantidade do Material!", "Campo Quantidade em Branco.", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            
            else if (dgvListaMateriais.RowCount == 0)
            {
                dgvListaMateriais.Rows.Add(txtDoc.Text, txtCodigo.Text, txtCodigoSky.Text, txtDescricaoMaterial.Text,
                        txtMarca.Text, txtModelo.Text, txtGrupo.Text, txtUnidade.Text, txtQuantidade.Text);


                txtCodigo.Text = string.Empty;
                txtCodigoSky.Text = string.Empty;
                txtDescricaoMaterial.Text = string.Empty;
                txtMarca.Text = string.Empty;
                txtModelo.Text = string.Empty;
                txtGrupo.Text = string.Empty;
                txtUnidade.Text = string.Empty;
                txtQuantidade.Text = string.Empty;
                txtQuantidade.Enabled = false;
                btnInserir.Enabled = false;
                txtDescricaoPesquisa.Text = string.Empty;
                txtDescricaoPesquisa.Focus();

                int TotalRegistros = dgvListaMateriais.RowCount;
                txtTotalRegistrosMateriais.Text = Convert.ToString(TotalRegistros);
                dgvListaMateriais.Update();
                dgvListaMateriais.Refresh();
            }
            
            
            else
            {
                foreach (DataGridViewRow item in dgvListaMateriais.Rows)

                {
                    string item_codigo = item.Cells[2].Value.ToString();
                    if (item_codigo == cod)
                    {
                        MessageBox.Show("Item já existe na requisição!", "Item Existente.", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                        txtCodigo.Text = string.Empty;
                        txtCodigoSky.Text = string.Empty;
                        txtDescricaoMaterial.Text = string.Empty;
                        txtMarca.Text = string.Empty;
                        txtModelo.Text = string.Empty;
                        txtGrupo.Text = string.Empty;
                        txtUnidade.Text = string.Empty;
                        txtQuantidade.Text = string.Empty;
                        txtQuantidade.Enabled = false;
                        btnInserir.Enabled = false;
                        txtDescricaoPesquisa.Text = string.Empty;
                        txtDescricaoPesquisa.Focus();
                    }
                    
                    else
                    {
                        dgvListaMateriais.Rows.Add(txtDoc.Text, txtCodigo.Text, txtCodigoSky.Text, txtDescricaoMaterial.Text,
                        txtMarca.Text, txtModelo.Text, txtGrupo.Text, txtUnidade.Text, txtQuantidade.Text);

                
                        txtCodigo.Text = string.Empty;
                        txtCodigoSky.Text = string.Empty;
                        txtDescricaoMaterial.Text = string.Empty;
                        txtMarca.Text = string.Empty;
                        txtModelo.Text = string.Empty;
                        txtGrupo.Text = string.Empty;
                        txtUnidade.Text = string.Empty;
                        txtQuantidade.Text = string.Empty;
                        txtQuantidade.Enabled = false;
                        btnInserir.Enabled = false;
                        txtDescricaoPesquisa.Text = string.Empty;
                        txtDescricaoPesquisa.Focus();

                        int TotalRegistros = dgvListaMateriais.RowCount;
                        txtTotalRegistrosMateriais.Text = Convert.ToString(TotalRegistros);
                        dgvListaMateriais.Update();
                        dgvListaMateriais.Refresh();
                        
                    }
                }
                
                
            }
        }

                txtCodigo.Text = string.Empty;
                txtCodigoSky.Text = string.Empty;
                txtDescricaoMaterial.Text = string.Empty;
                txtMarca.Text = string.Empty;
                txtModelo.Text = string.Empty;
                txtGrupo.Text = string.Empty;
                txtUnidade.Text = string.Empty;
                txtQuantidade.Text = string.Empty;
                txtQuantidade.Enabled = false;
                btnInserir.Enabled = false;
                txtDescricaoPesquisa.Text = string.Empty;

Cara, cria um método pra isso!

Esse if/else abaixo está com problema, só verifica a primeira linha.

 foreach (DataGridViewRow item in dgvListaMateriais.Rows)

                {
                    string item_codigo = item.Cells[2].Value.ToString();
                    if (item_codigo == cod)
                    {
                        MessageBox.Show("Item já existe na requisição!", "Item Existente.", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                        txtCodigo.Text = string.Empty;
                        txtCodigoSky.Text = string.Empty;
                        txtDescricaoMaterial.Text = string.Empty;
                        txtMarca.Text = string.Empty;
                        txtModelo.Text = string.Empty;
                        txtGrupo.Text = string.Empty;
                        txtUnidade.Text = string.Empty;
                        txtQuantidade.Text = string.Empty;
                        txtQuantidade.Enabled = false;
                        btnInserir.Enabled = false;
                        txtDescricaoPesquisa.Text = string.Empty;
                        txtDescricaoPesquisa.Focus();
                    }
                    
                    else
                    {
                        d

Teria que fazer um break quando desse problema, e no else, em vez de adicionar, colocar um boolean fazendo controle.

Dá pra fazer um controle com linq sem utilizar foreacho, algo como (utilizar using System.Linq)

bool contains = dgvListaMateriais.AsEnumerable().Any(row => item_codigo == row[2].Value.ToString()); //algo assim, e o ideal é não pegar pelo indice a coluna (2) e sim pelo nome.

Att,



Charles Menezes disse:

Segue trecho do código, o que devo fazer para ele funcionar perfeitamente, pois ele até verifica com dois itens, com 3 já começa dar problema...tem alguma coisa errada no foreach....se puderem me ajudar a corrigir esse código....

Obrigado!

private void btnInserir_Click(object sender, EventArgs e)
        {

            string cod = txtCodigoSky.Text;

            if(txtQuantidade.Text == "")
            {
                MessageBox.Show("Digite a Quantidade do Material!", "Campo Quantidade em Branco.", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            
            else if (dgvListaMateriais.RowCount == 0)
            {
                dgvListaMateriais.Rows.Add(txtDoc.Text, txtCodigo.Text, txtCodigoSky.Text, txtDescricaoMaterial.Text,
                        txtMarca.Text, txtModelo.Text, txtGrupo.Text, txtUnidade.Text, txtQuantidade.Text);


                txtCodigo.Text = string.Empty;
                txtCodigoSky.Text = string.Empty;
                txtDescricaoMaterial.Text = string.Empty;
                txtMarca.Text = string.Empty;
                txtModelo.Text = string.Empty;
                txtGrupo.Text = string.Empty;
                txtUnidade.Text = string.Empty;
                txtQuantidade.Text = string.Empty;
                txtQuantidade.Enabled = false;
                btnInserir.Enabled = false;
                txtDescricaoPesquisa.Text = string.Empty;
                txtDescricaoPesquisa.Focus();

                int TotalRegistros = dgvListaMateriais.RowCount;
                txtTotalRegistrosMateriais.Text = Convert.ToString(TotalRegistros);
                dgvListaMateriais.Update();
                dgvListaMateriais.Refresh();
            }
            
            
            else
            {
                foreach (DataGridViewRow item in dgvListaMateriais.Rows)

                {
                    string item_codigo = item.Cells[2].Value.ToString();
                    if (item_codigo == cod)
                    {
                        MessageBox.Show("Item já existe na requisição!", "Item Existente.", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                        txtCodigo.Text = string.Empty;
                        txtCodigoSky.Text = string.Empty;
                        txtDescricaoMaterial.Text = string.Empty;
                        txtMarca.Text = string.Empty;
                        txtModelo.Text = string.Empty;
                        txtGrupo.Text = string.Empty;
                        txtUnidade.Text = string.Empty;
                        txtQuantidade.Text = string.Empty;
                        txtQuantidade.Enabled = false;
                        btnInserir.Enabled = false;
                        txtDescricaoPesquisa.Text = string.Empty;
                        txtDescricaoPesquisa.Focus();
                    }
                    
                    else
                    {
                        dgvListaMateriais.Rows.Add(txtDoc.Text, txtCodigo.Text, txtCodigoSky.Text, txtDescricaoMaterial.Text,
                        txtMarca.Text, txtModelo.Text, txtGrupo.Text, txtUnidade.Text, txtQuantidade.Text);

                
                        txtCodigo.Text = string.Empty;
                        txtCodigoSky.Text = string.Empty;
                        txtDescricaoMaterial.Text = string.Empty;
                        txtMarca.Text = string.Empty;
                        txtModelo.Text = string.Empty;
                        txtGrupo.Text = string.Empty;
                        txtUnidade.Text = string.Empty;
                        txtQuantidade.Text = string.Empty;
                        txtQuantidade.Enabled = false;
                        btnInserir.Enabled = false;
                        txtDescricaoPesquisa.Text = string.Empty;
                        txtDescricaoPesquisa.Focus();

                        int TotalRegistros = dgvListaMateriais.RowCount;
                        txtTotalRegistrosMateriais.Text = Convert.ToString(TotalRegistros);
                        dgvListaMateriais.Update();
                        dgvListaMateriais.Refresh();
                        
                    }
                }
                
                
            }
        }

o que falei acima de continuar validando pelo foreach seria algo assim:

foreach (DataGridViewRow item in dgvListaMateriais.Rows)

{
string item_codigo = item.Cells[2].Value.ToString();
bool existe = false;


if (item_codigo == cod)
{
bool existe = true;
}


}

if(existe)
{
MessageBox.Show("Item já existe na requisição!", "Item Existente.", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
else
{
dgvListaMateriais.Rows.Add(txtDoc.Text, txtCodigo.Text, txtCodigoSky.Text, txtDescricaoMaterial.Text,
txtMarca.Text, txtModelo.Text, txtGrupo.Text, txtUnidade.Text, txtQuantidade.Text);
}


txtCodigo.Text = string.Empty;
txtCodigoSky.Text = string.Empty;
txtDescricaoMaterial.Text = string.Empty;
txtMarca.Text = string.Empty;
txtModelo.Text = string.Empty;
txtGrupo.Text = string.Empty;
txtUnidade.Text = string.Empty;
txtQuantidade.Text = string.Empty;
txtQuantidade.Enabled = false;
btnInserir.Enabled = false;
txtDescricaoPesquisa.Text = string.Empty;

//cria um método pra limar esses campos....


txtDescricaoPesquisa.Focus();

int TotalRegistros = dgvListaMateriais.RowCount;
txtTotalRegistrosMateriais.Text = Convert.ToString(TotalRegistros);
dgvListaMateriais.Update();
dgvListaMateriais.Refresh();

dá uma olhada nesses códigos, pq não testei...

Já consegui resolver, mas ainda precisa de dar uma polida....veja como está agora.

 

DataGridViewCell celulas;

                List<String> listacodigo = new List<string>();

                for (int j = 0; j < dgvListaMateriais.RowCount; j++)

                {

                    for (int k = 0; k < dgvListaMateriais.ColumnCount; k++)

                    {

                        celulas = dgvListaMateriais[k, j];

                        listacodigo.Add(celulas.Value.ToString());

                    }

                }

 

 

Isso resolveu o problema....Eu só gostaria de pegar apenas a coluna cujo o índice é 2 ou título "Código" ainda consegui. Do jeito que está estou pegando todas as células de todas as colunas, como faço para pegar apenas as células da coluna em questão?

 

Charles Menezes.



Felipe M. Martins disse:

o que falei acima de continuar validando pelo foreach seria algo assim:

foreach (DataGridViewRow item in dgvListaMateriais.Rows)

{
string item_codigo = item.Cells[2].Value.ToString();
bool existe = false;


if (item_codigo == cod)
{
bool existe = true;
}


}

if(existe)
{
MessageBox.Show("Item já existe na requisição!", "Item Existente.", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
else
{
dgvListaMateriais.Rows.Add(txtDoc.Text, txtCodigo.Text, txtCodigoSky.Text, txtDescricaoMaterial.Text,
txtMarca.Text, txtModelo.Text, txtGrupo.Text, txtUnidade.Text, txtQuantidade.Text);
}


txtCodigo.Text = string.Empty;
txtCodigoSky.Text = string.Empty;
txtDescricaoMaterial.Text = string.Empty;
txtMarca.Text = string.Empty;
txtModelo.Text = string.Empty;
txtGrupo.Text = string.Empty;
txtUnidade.Text = string.Empty;
txtQuantidade.Text = string.Empty;
txtQuantidade.Enabled = false;
btnInserir.Enabled = false;
txtDescricaoPesquisa.Text = string.Empty;

//cria um método pra limar esses campos....


txtDescricaoPesquisa.Focus();

int TotalRegistros = dgvListaMateriais.RowCount;
txtTotalRegistrosMateriais.Text = Convert.ToString(TotalRegistros);
dgvListaMateriais.Update();
dgvListaMateriais.Refresh();

dá uma olhada nesses códigos, pq não testei...

RSS

© 2018   Criado por Ramon Durães.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço