DELETAR LINHA EM DATAGRIDVIEW COM DATASOURCE

PERCIFILHO 05/05/2017 16:20:21
#473763
Boa tarde meus amigos;
Precisava preencher um DataGridView e deixar para o usuário deletar a linha que ele quiser deletar. O problema é que eu preencho o DataGridView com DataSource, sendo assim não me é permitido excluir linhas.
Como devo proceder nesse caso?
O modo como eu preencho o DataGridView (com LINQ, usando Entity Framework):

using (db = new Conexao())
{
var dados = from c in db.Cliente
select c;

dgv.DataSource = dados.ToList();
}
JABA 05/05/2017 16:51:52
#473765
Inclua cada registro manualmente sem usar o DataSource, não vejo outro jeito.
GUIMORAES 05/05/2017 17:45:37
#473766
é possível fazer isto a partir de um DataRow. Para isto, você instancia um DataTable e utiliza o DataSorce da sua grid para [Ô]Preencher[Ô] a sua DataTable.
Não gosto de trabalhar assim, pois você fica com a sua grid muito amarrada, sem flexibilidade. Então eu adiciono os registros a grid manualmente, quando preciso de uma grid dinâmica.
Por experiência própria, popule a sua grid manualmente, percorrendo os dados de seu objeto, talvez você tenha o trabalho de fazer isto agora, mas vai ser melhor no futuro.

NILSONTRES 06/05/2017 08:37:27
#473770
Citação:

Por experiência própria, popule a sua grid manualmente, percorrendo os dados de seu objeto, talvez você tenha o trabalho de fazer isto agora, mas vai ser melhor no futuro.


A Controvérsias, Mas eu sempre disse isso, se é um controle que não é recomendado carregar via datasource é o Datagrid, esse controle é muito mais que uma simples grade.
é Possível sim fazer o que nosso amigo deseja, mas não sei como, visto que sempre optei pelo carregamento manual.
PERCIFILHO 08/05/2017 08:10:14
#473790
Ok, pessoal, vou preencher, então, sem o uso do DataSource.
Obrigado a todos pelas opiniões.
Abraços e até mais.
DS2T 08/05/2017 09:42:32
#473791
Resposta escolhida
Só dando minha humilde opinião antes de fechar o tópico.
Basta que você use o evento KeyDown para capturar a tecla [Ô]Delete[Ô] e remover o registro manualmente. Tendo apagado o registro, você apaga o mesmo index do seu DataSource (List<>).

Então você manteria o sincronismo entre o DataGridView e o DataSource dessa maneira.
PERCIFILHO 08/05/2017 10:47:57
#473794
Vou tentar aqui, DS2T, muito obrigado pela ajuda.
PERCIFILHO 10/05/2017 07:52:07
#473856
Bom, pessoal, não tem jeito, tive que carregar os dados manualmente. Acontece que os registros do DataGridView não serão deletados da tabela de dados, apenas serão retirados da grid. Então, como não tem outra maneira terei que preencher o DataGridView sem o DataSource.
Talvez eu não tenha explicado direito a minha situação. é a seguinte:
O usuário tem um DataGridView preenchido com os registros que não foram gerados em determinada tabela. Aí ele vai deixar na grid somente os registros que ele deseja gerar, deletando (somente na grid) os registros que ele vai gerar mais tarde. Eu poderia, também, ao invés de deixar o usuário deletar a linha da grid, fazer uma CheckBox na coluna e ele selecionaria os registros desejados. Vou até pensar nesse caso.

Colega NILSONTRES, confesso que antigamente eu também carregava o DataGridView manualmente, mas depois que comecei a utilizar a OOP nos projetos, fiz como o colega KERPLUNK sempre falou e passei a carregar com o DataSource e não me arrependo, é bem mais prático e rápido, uma vez que esse controle é somente para visualização dos dados. Salvo alguns casos específicos, como por exemplo esse meu agora, é que eu carrego os dados manualmente, senão é tudo feito com a [Ô]ajuda[Ô] do DataSource.

Obrigado a todos.
DS2T 10/05/2017 08:39:24
#473858
Bom dia!

Fiz um pequeno exemplo pra você:

Crie essa classe:


    public class Mulher
{
public string Nome { get; set; }

public string Observacao { get; set; }

public string Profissao { get; set; }
}



Coloque um datagridview e um button em seu formulário.
O código no formulário ficará assim:


public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
RemoveLinhaSelecionada();
}


private void Form1_Load(object sender, EventArgs e)
{
CarregaGrid();
}

private void CarregaGrid()
{
BindingList<Mulher> mulheres = new BindingList<Mulher>();
mulheres.Add(new Mulher() { Nome = [Ô]Fernanda Paes Leme[Ô], Observacao = [Ô]As segundas e terças[Ô], Profissao = [Ô]Namorada do DS2T[Ô] });
mulheres.Add(new Mulher() { Nome = [Ô]Flávia Alessandra[Ô], Observacao = [Ô]As quartas e quintas[Ô], Profissao = [Ô]Namorada do DS2T[Ô] });
mulheres.Add(new Mulher() { Nome = [Ô]Marina Ruy Barbosa[Ô], Observacao = [Ô]Sextas e sábados[Ô], Profissao = [Ô]Namorada do DS2T[Ô] });
dataGridView1.DataSource = mulheres;
}

private void RemoveLinhaSelecionada()
{
if (dataGridView1.SelectedRows.Count > 0)
{
int index = dataGridView1.SelectedRows[0].Index;
dataGridView1.Rows.RemoveAt(index);
}
}




Repare que ao invés de usar um List<>, eu usei um BindingList. Ele implementa a interface IBinding e, assim, consegue identificar as alterações no grid e refletir para seu datasource.
Repare que a medida que o usuário for clicando no botão e removendo do grid, isso refletirá no seu DataSource também.

Abraços!
GUIMORAES 10/05/2017 08:49:12
#473860
Citação:

:
Bom, pessoal, não tem jeito, tive que carregar os dados manualmente. Acontece que os registros do DataGridView não serão deletados da tabela de dados, apenas serão retirados da grid. Então, como não tem outra maneira terei que preencher o DataGridView sem o DataSource.
Talvez eu não tenha explicado direito a minha situação. é a seguinte:
O usuário tem um DataGridView preenchido com os registros que não foram gerados em determinada tabela. Aí ele vai deixar na grid somente os registros que ele deseja gerar, deletando (somente na grid) os registros que ele vai gerar mais tarde. Eu poderia, também, ao invés de deixar o usuário deletar a linha da grid, fazer uma CheckBox na coluna e ele selecionaria os registros desejados. Vou até pensar nesse caso.

Colega NILSONTRES, confesso que antigamente eu também carregava o DataGridView manualmente, mas depois que comecei a utilizar a OOP nos projetos, fiz como o colega KERPLUNK sempre falou e passei a carregar com o DataSource e não me arrependo, é bem mais prático e rápido, uma vez que esse controle é somente para visualização dos dados. Salvo alguns casos específicos, como por exemplo esse meu agora, é que eu carrego os dados manualmente, senão é tudo feito com a [Ô]ajuda[Ô] do DataSource.

Obrigado a todos.



PERCIFILHO,

Preencher um DataGrid manualmente não fará você fugir do contexto da orientação a objetos, o importante é que a regra de negócios esteja correta, no contexto da visualização isto muda, pois muitas vezes precisamos fazer certas coisas com os [Ô]controles[Ô] de visualização que acabam fugindo do convencional, ou te dá a impressão de ser [Ô]mais complexo[Ô], mas isto não quer dizer que você não está programando orientado a objetos. O que as pessoas precisam entender (não é seu caso) é que a orientação a objetos é um avanço na forma de se programar, mas isto não quer dizer que será mais fácil. Montar uma estrutura de um projeto, muito bem estruturada, pode levar mais tempo do que uma aplicação sem qualquer padronização, enfim, a melhor coisa que tu fez foi carregar a grid manualmente.

Um abraço.
Tópico encerrado , respostas não são mais permitidas