DELETAR LINHA EM DATAGRIDVIEW COM DATASOURCE
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();
}
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.
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.
Obrigado a todos pelas opiniões.
Abraços e até mais.
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.
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.
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!
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.