Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Удаление строки в WPF DataGrid / 22 сообщений из 22, страница 1 из 1
22.10.2010, 16:39
    #36915075
zvb73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
В 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
22.10.2010, 17:13
    #36915157
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
Как вариант:
1. Изначально запомнить DataTable в члене модели / класса формы
2. Если удаление было отменено - восстановиться из сохраненной DataTable
...
Рейтинг: 0 / 0
22.10.2010, 17:15
    #36915161
zvb73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
Так помоему ещё извратнее
...
Рейтинг: 0 / 0
22.10.2010, 17:38
    #36915206
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
Извратнее юзать DataTable, вместо нормальных типизированных обсервейбл коллекций или списков.
...
Рейтинг: 0 / 0
22.10.2010, 17:56
    #36915248
Вестник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
МСУИзвратнее юзать DataTable, вместо нормальных типизированных обсервейбл коллекций или списков.было бы проще решить задачу?
...
Рейтинг: 0 / 0
22.10.2010, 18:18
    #36915295
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
Вестникбыло бы проще решить задачу?
Да.
...
Рейтинг: 0 / 0
22.10.2010, 18:22
    #36915304
zvb73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
а подробностей не будет?
...
Рейтинг: 0 / 0
22.10.2010, 18:29
    #36915314
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
На досуге напишу.
...
Рейтинг: 0 / 0
22.10.2010, 19:49
    #36915420
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
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
22.10.2010, 19:56
    #36915425
Вестник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
так... э.... DataGrid_PreviewKeyDown - остался. не вижу упрощения
...
Рейтинг: 0 / 0
22.10.2010, 20:05
    #36915436
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
Сорри, недописал прошлый код:

Код: 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
22.10.2010, 20:15
    #36915453
zvb73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
в код надо будет вникнуть, с понятием модель в впф я не знаком.
МСУ, а вы принципиально настроены против DataTable ?
...
Рейтинг: 0 / 0
22.10.2010, 20:21
    #36915460
zvb73
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
МСУЕсли не нравится PreviewKeyDown, пусть команды юзает напрямую из XAML.

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

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

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

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

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

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

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


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



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

пока вы в своём Виларибо пропишете на коллекциях ту же версионность строк, ребятя из Вилабаджо будут пляски с девушками неделю плясать
...
Рейтинг: 0 / 0
24.10.2010, 20:09
    #36916858
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
MCУ, "член главной модели" c полным копированием коллекции - знатные велосипеды. Даже DataTable перед этим не идут ни в какое сравнение.
...
Рейтинг: 0 / 0
24.10.2010, 20:19
    #36916866
i
i
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Удаление строки в WPF DataGrid
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
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Удаление строки в WPF DataGrid / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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