powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Удаление строки в WPF DataGrid
22 сообщений из 22, страница 1 из 1
Удаление строки в WPF DataGrid
    #36915075
zvb73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В DataGrid стандартно строка удаляется нажатим клавиши Del. Есть необходимость запрашивать подтверждение пользователя перед удалением. Сам DataGrid евент об удалении не выдаёт, в связанном DataTable есть RowDeleting но там нельзя отменить удаление.

Сделал через евент PreviewKeyDown таким образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        private void dataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                if (MessageBox.Show("delete?", "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    dataGrid.CanUserDeleteRows = true;
                }
                else
                {
                    dataGrid.CanUserDeleteRows = false;
                }
            }
        }

Работает, но имхо должно быть более нормальное решение. Кто что скажет?
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915157
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант:
1. Изначально запомнить DataTable в члене модели / класса формы
2. Если удаление было отменено - восстановиться из сохраненной DataTable
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915161
zvb73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так помоему ещё извратнее
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915206
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извратнее юзать DataTable, вместо нормальных типизированных обсервейбл коллекций или списков.
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915248
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУИзвратнее юзать DataTable, вместо нормальных типизированных обсервейбл коллекций или списков.было бы проще решить задачу?
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915295
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вестникбыло бы проще решить задачу?
Да.
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915304
zvb73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а подробностей не будет?
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915314
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На досуге напишу.
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915420
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MainWindow.xaml
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:model="clr-namespace:WpfApp.Models"
        Title="MainWindow" Height="350" Width="525">
    
    <Window.DataContext>
        <model:MainWindowModel />
    </Window.DataContext>

    <DataGrid Name="gdUsers" ItemsSource="{Binding Items}" PreviewKeyDown="DataGrid_PreviewKeyDown">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding UserId}" Width="Auto" Header="Код" IsReadOnly="True" />
            <DataGridTextColumn Binding="{Binding UserName}" Width="SizeToHeader" Header="Название" IsReadOnly="True" />
        </DataGrid.Columns>
    </DataGrid>
</Window>


MainWindow.cs
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Delete)
        {
            if (MessageBox.Show("Удалить?", "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                (DataContext as MainWindowModel).Remove(gdUsers.SelectedItem as User);
            }
        }
    }
}


MainWindowModel.cs
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public class MainWindowModel
{
    private ObservableCollection<User> items { get; set; }

    public MainWindowModel()
    {
        items = new ObservableCollection<User>(Enumerable.Range(1, 10).Select(d => new User { UserId = d, UserName = "User " + d }));
    }

    public ObservableCollection<User> Items
    {
        get
        {
            return items;
        }
        set
        {
            items = value;
        }
    }

    public void Remove(User CurrentUser)
    {
        Items = new ObservableCollection<User>(Items.Where(d => d != CurrentUser));
    }
}

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
}


Всё. И никаких телодвижений не нужно.
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915425
Вестник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так... э.... DataGrid_PreviewKeyDown - остался. не вижу упрощения
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915436
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, недописал прошлый код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:model="clr-namespace:WpfApp.Models"
        Title="MainWindow" Height="350" Width="525">
    
    <Window.DataContext>
        <model:MainWindowModel />
    </Window.DataContext>

    <DataGrid Name="gdUsers" ItemsSource="{Binding Items, Mode=TwoWay}" CanUserDeleteRows="False" AutoGenerateColumns="False" PreviewKeyDown="DataGrid_PreviewKeyDown">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding UserId}" Width="Auto" Header="Код" IsReadOnly="True" />
            <DataGridTextColumn Binding="{Binding UserName}" Width="SizeToHeader" Header="Название" IsReadOnly="True" />
        </DataGrid.Columns>
    </DataGrid>
</Window>

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.Delete)
        {
            if (MessageBox.Show("Удалить?", "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                (DataContext as MainWindowModel).Remove(gdUsers.SelectedItem as User);
            }
        }
    }
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
public class MainWindowModel: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    private ObservableCollection<User> items;
    
    public ObservableCollection<User> Items
    {
        get
        {
            return items;
        }
        set
        {
            items = value;
            NotifyPropertyChanged("Items");
        }
    }

    public MainWindowModel()
    {
        Items = new ObservableCollection<User>(Enumerable.Range(1, 10).Select(d => new User { UserId = d, UserName = "User " + d }));
    }

    public void Remove(User CurrentUser)
    {
        Items = new ObservableCollection<User>(Items.Where(d => d != CurrentUser));
    }
}

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
}

Вестниктак... э.... DataGrid_PreviewKeyDown - остался. не вижу упрощения
Ну и что? Если не нравится PreviewKeyDown, пусть команды юзает напрямую из XAML.
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915453
zvb73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в код надо будет вникнуть, с понятием модель в впф я не знаком.
МСУ, а вы принципиально настроены против DataTable ?
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915460
zvb73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУЕсли не нравится PreviewKeyDown, пусть команды юзает напрямую из XAML.

мне как раз код нравится больше чем XAML :)

но вобще-то изначально вопрос был вызван удивлением, что а датагриде есть например BeginningEdit, который можно отменить Cancel'ом, но нету BeginningDelete
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915461
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvb73в код надо будет вникнуть, с понятием модель в впф я не знаком.
Вникайте. Если хотите стопроцентной декларативности - юзайте паттерн MVVM.
Но лично мне он не по душе - мне нравится модель максимально прорисовывать в коде, но при представлении иметь "клики" с вывовом методов модели.

zvb73МСУ, а вы принципиально настроены против DataTable ?
Лишь в крайних случаях, когда их не избежать. Например, поставка данных из стороннего сервиса, структура заранее неизвестна. Ну ё-маё, 21 век, а Вы всё с тормозными дататэйблами ковыряетесь.
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915462
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvb73но вобще-то изначально вопрос был вызван удивлением, что а датагриде есть например BeginningEdit, который можно отменить Cancel'ом, но нету BeginningDelete
Почитайте это: Overview of the editing features in the WPF DataGrid . Как раз там о командах.
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915465
zvb73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУzvb73МСУ, а вы принципиально настроены против DataTable ?
Лишь в крайних случаях, когда их не избежать. Например, поставка данных из стороннего сервиса, структура заранее неизвестна. Ну ё-маё, 21 век, а Вы всё с тормозными дататэйблами ковыряетесь.

Ну вроде где-то так оно и есть - надо отрисовывать таблички из ХМЛ не особо вникая в их содержимое
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915467
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zvb73с понятием модель в впф я не знаком
Уточню. Речь о "модели представления". То есть, есть представление (xaml), есть его модель (то, что Вы видели в MainWindowModel.cs) и есть просто модель (класс User в данном случае).

Почитайте это: Приложения WPF с шаблоном проектирования модель-представление-модель представления , если хотите вникнуть.

zvb73Ну вроде где-то так оно и есть - надо отрисовывать таблички из ХМЛ не особо вникая в их содержимое
Типизации не поддаётся?
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915469
zvb73
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУТипизации не поддаётся?

типизированные конечно, причём это даже экспорт из какой-то БД, но зачем вникать в их содержимое, если нет такой необходимости
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36915475
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, уговорили :) Пишите тоже самое на таблицах.
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36916635
Фотография Шайтан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ.... юзайте паттерн MVVM буэээээ....


МСУлично мне он не по душе плюсстопитьсот :)



МСУzvb73МСУ, а вы принципиально настроены против DataTable ?
Лишь в крайних случаях, когда их не избежать. минусстокаже

пока вы в своём Виларибо пропишете на коллекциях ту же версионность строк, ребятя из Вилабаджо будут пляски с девушками неделю плясать
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36916858
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
MCУ, "член главной модели" c полным копированием коллекции - знатные велосипеды. Даже DataTable перед этим не идут ни в какое сравнение.
...
Рейтинг: 0 / 0
Удаление строки в WPF DataGrid
    #36916866
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
zvb73В DataGrid стандартно строка удаляется нажатим клавиши Del. Есть необходимость запрашивать подтверждение пользователя перед удалением. Сам DataGrid евент об удалении не выдаёт, в связанном DataTable есть RowDeleting но там нельзя отменить удаление.

Сделал через евент PreviewKeyDown таким образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        private void dataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Delete)
            {
                if (MessageBox.Show("delete?", "", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    dataGrid.CanUserDeleteRows = true;
                }
                else
                {
                    dataGrid.CanUserDeleteRows = false;
                }
            }
        }

Работает, но имхо должно быть более нормальное решение. Кто что скажет?
Для этого можно создать behaivor или расширить datagrid, если в нем нет подобного функционала.
Команды в этом тривиальном случае - это применение шаблона совершенно не в тему
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Удаление строки в WPF DataGrid
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]