none
Remover registros do meu datatable RRS feed

  • Pergunta

  • Boa tarde,

    estou começando a desenvolver em WPF e estou com problemas em remover uma pessoa do meu datatable através da seleção de uma checkboxcolumn em meu datagrid.

    Segue parte do meu xaml:

    <Window x:Class="Cadastro.wPessoas"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:t="http://schemas.microsoft.com/wpf/2008/toolkit"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        xmlns:m="clr-namespace:Cadastro;assembly=Cadastro"        xmlns:local="clr-namespace:Cadastro"                xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"        mc:Ignorable="d"        Title="Pessoas" Height="840.532" Width="643.874">
    <Grid Height="660" VerticalAlignment="Top">
    <Grid.RowDefinitions>
    <RowDefinition Height="*"/>
    <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <GroupBox Margin="0,608,0,-154" Grid.RowSpan="2">
    <t:DataGrid Name="dgPessoas" Grid.Row="0" AutoGenerateColumns="False" CanUserDeleteRows="True" IsReadOnly="False" CanUserAddRows="False" HorizontalScrollBarVisibility="Auto" Width ="Auto"  VerticalScrollBarVisibility="Auto" RowHeaderWidth="0"  SelectionMode="Extended" SelectionUnit="FullRow" Margin="0,-172,-2,-6" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" ItemsSource="{Binding _dtPessoas}" Height="378" RenderTransformOrigin="0.511,0.603" PreviewMouseLeftButtonDown="dg_Preview">
    <t:DataGrid.Columns>
    <t:DataGridCheckBoxColumn Width="30" Binding="{Binding Check, Mode=TwoWay}" CanUserReorder="False" CanUserResize="False" CanUserSort="False">
    <t:DataGridCheckBoxColumn.HeaderTemplate>
    <DataTemplate>
    <CheckBox x:Name="chkGridAll" Width="auto" Margin="3,2,0,0"  PreviewMouseLeftButtonDown="chk_Preview" Checked ="chkGrid_Checked" Unchecked="chkGridAll_Unchecked"/>
    </DataTemplate>
    </t:DataGridCheckBoxColumn.HeaderTemplate>
    </t:DataGridCheckBoxColumn>
    <t:DataGridTextColumn Binding="{Binding Id}"  Header="ID" IsReadOnly="True" MinWidth="30" />                    <t:DataGridTextColumn Binding="{Binding Nome}" Header="Nome" IsReadOnly="True" MinWidth="45"/>            
    [etc]

    code-behind do meu botao excluir:

    private void btExcluir_Click(object sender, RoutedEventArgs e)
    {
          dgPessoas.UpdateLayout();
          DataRowView row=(DataRowView)dgPessoas.SelectedItem;        int _id = (int)row.Row.ItemArray[0];
    
    if (dgPessoas.SelectedIndex != -1)
    {
          if (!(Xceed.Wpf.Toolkit.MessageBox.Show("Você está prestes a excluir uma pessoa. Por favor confirme", "Excluir pessoa", MessageBoxButton.OKCancel) == MessageBoxResult.OK))
        {
           e.Handled = true;
        } 
         else
         {
          Pessoa.ExcluiPessoa(_id);
          CarregaLista();
          AlteraBotoes();
         }
       } 
        else
       {
          Xceed.Wpf.Toolkit.MessageBox.Show("Selecione pelo menos uma pessoa para excluir da lista");
         return;
    }
    foreach (DataGridRow row in dgPessoas.Items)
     {
       if (_chk.IsChecked == true)
         {
          int _id = Pessoa._dtPessoas.Select
         }
     }
    }
    (lembrando que está excluindo pela seleção do mouse e preciso excluir pela seleção das checkboxes).

    Como proceder?

    quarta-feira, 22 de fevereiro de 2017 18:56

Respostas

  • Achei a solução:

    private void btExcluir_Click(object sender, RoutedEventArgs e)
            {
                dgPessoas.UpdateLayout();
               try
                {
                    if (_lstSelec.Count > 0)
                    {
                            Pessoa.ExcluiPessoa(_lstSelec);
                            CarregaLista();
                            _lstSelec.Clear();


                    }
                }
                catch (Exception ex)
                {
                    Xceed.Wpf.Toolkit.MessageBox.Show(ex.Message);
                }
            }

    private void dgPessoas_RowEditEnding(object sender, Microsoft.Windows.Controls.DataGridRowEditEndingEventArgs e)
            {
                FrameworkElement element = dgPessoas.Columns[0].GetCellContent(e.Row);
                if (element.GetType() == typeof(CheckBox))
                {
                    if (((CheckBox)element).IsChecked == true)
                    {
                        CheckBox _check = dgPessoas.Columns[0].GetCellContent(dgPessoas.SelectedItem) as CheckBox;
                        FrameworkElement _cellID = dgPessoas.Columns[1].GetCellContent(e.Row);
                        for (int i = 0; i < dgPessoas.Items.Count; i++)
                        {                        
                            if (_check.IsChecked != null)
                            {
                                int ID = Convert.ToInt32(((TextBlock)_cellID).Text);
                                _lstSelec.Add(ID);
                            }
                        }
                    }
                }
            }
            private void chkGridAll_Checked(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i < dgPessoas.Items.Count; i++)
                {
                    dgPessoas.SelectedIndex = i;
                    CheckBox _check = dgPessoas.Columns[0].GetCellContent(dgPessoas.SelectedItem) as CheckBox;
                    FrameworkElement _cellID = dgPessoas.Columns[1].GetCellContent(dgPessoas.SelectedItem);
                    ID = Convert.ToInt32(((TextBlock)_cellID).Text);
                    _lstSelec.Add(ID);                               
                    if (_check != null)
                    {
                        _check.IsChecked = true;
                    }                 
                }

            }
            private void chkGridAll_Unchecked(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i < dgPessoas.Items.Count; i++)
                {
                    dgPessoas.SelectedIndex = i;
                    CheckBox Check = dgPessoas.Columns[0].GetCellContent(dgPessoas.SelectedItem) as CheckBox;

                    if (Check != null)
                    {
                        Check.IsChecked = false;
                    }
                }
            } 

    E na classe Pessoa

    public static void ExcluiPessoa(List<int>_lstID)
            {
                List<Pessoa> remove = new List<Pessoa>();
                foreach (var item in _lstID)
                {
                    remove = _lst.Where(x => x.Id.Equals(item)).ToList();
                    remove.ForEach(x => _lst.Remove(x));
                }
                ToDataTable(_lst, _dtPessoas);
                MessageBox.Show("Pessoa excluída com sucesso", "Exclusão", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }

    sexta-feira, 3 de março de 2017 13:49