Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.04.2021
Сообщений: 3
WPF

Datagrid Данные при нажатии на кнопку

25.05.2021, 20:07. Показов 3365. Ответов 5
Метки wpf (Все метки)

Студворк — интернет-сервис помощи студентам
Есть датагрид с данными, в каждой строке есть кнопка, как при нажатии на кнопку получить данные в метод по событию кнопки из той строки, где она была?
XML
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
<DataGrid Name="ManagerProductGrid" AutoGenerateColumns="False" 
              IsReadOnly="True" SelectionChanged="ManagerProductGrid_SelectionChanged" >
        <DataGrid.Columns>
            <DataGridTextColumn Header="№" Width="*" Binding="{Binding ProductId}"/>
            <DataGridTextColumn Header="Модель"  Width="*" Binding="{Binding IdName}" />
            <DataGridTextColumn Header="Производитель" Width="*" Binding="{Binding IdManufacturer}"/>
            <DataGridTextColumn Header="Страна"  Width="*" Binding="{Binding IdCountry}" />
            <DataGridTextColumn Header="Тип" Width="*" Binding="{Binding IdType}"/>
            <DataGridTextColumn Header="Цвет"  Width="*" Binding="{Binding IdColor}" />
            <DataGridTextColumn Header="Штрихкод" Width="150" Binding="{Binding Bartcode}"/>
            <DataGridTemplateColumn  Header="Работа со штрихкодом" Width="150" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Сгенерировать штрихкод" FontSize="12" Width="150" Height="20" Click="Button_Click"></Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn  Header="Изменение данных" Width="120" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Изменить" FontSize="12" Width="120" Height="20"></Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn  Header="Удаление данных" Width="110" >
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Удалить" FontSize="12" Width="110" Height="20"></Button>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.05.2021, 20:07
Ответы с готовыми решениями:

Как в combobox выбрать нужный элемент в списке при нажатии на кнопку, беря данные из DataGrid?
Доброго времени суток. Нужно сделать так, чтобы в ComboBox &quot;DolzhnostCB&quot; и &quot;GruppyCB&quot; при нажатии...

DataGrid: установить фокус на строку DataGrid, а не на сам DataGrid
Добрый день! Есть следующий код: public partial class MainWindow : Window { ...

Файл: Как сделать так, чтобы при нажатии на 1-ую кнопку считывалася 1-ая строка, при нажатии на 2 - 2 строка и т.д.
На форме размещено 30 кнопок. В файле .txt размещено 30 строк. Как сделать так чтобы при нажатий на...

5
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
25.05.2021, 20:27
Victusic, по нормальному - делается команда и в её параметре передаются данные.

Если через жопу костылями, то задайте привязку параметру команды, а в кликере извлеките этот параметр и приведите его типу элемента.


В XAML:
XML
14
15
16
         <Button Content="Сгенерировать штрихкод" FontSize="12" Width="150" Height="20"
                 Click="Button_Click"
                 CommandParameter="{Binding}"></Button>
В Code Behind:
C#
1
2
3
4
5
6
   private void Button_Click(object sender, ...)
   {
        Button button = (Button) sender;
        var parameter = (ТипЭлементаКоллекции) button.CommandParameter;
        // Дальше работаем с переменной parameter
   }
0
0 / 0 / 0
Регистрация: 07.04.2021
Сообщений: 3
25.05.2021, 21:18  [ТС]
Можете пожалуйста уточнить, что вы имеете ввиду под "ТипЭлементаКоллекции"
0
18 / 18 / 1
Регистрация: 18.01.2021
Сообщений: 183
Записей в блоге: 8
25.05.2021, 22:00
Цитата Сообщение от Victusic Посмотреть сообщение
Есть датагрид с данными, в каждой строке есть кнопка
Рассмотрите вариант с MouseDoubleClick:
C#
1
2
3
4
5
6
7
    //-- Обработка двойного щелчка кнопки мышки 
    //================================================================
    private void dgv_Entity_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e) {
      if ( (dgv_Entity.CurrentColumn == null) || (dgv_Entity.SelectedIndex == -1)) return;
      xrow = (row_Entity)dgv_Entity.SelectedItem; iEnt = oc_Entity.IndexOf(xrow); 
      . . .
    }
где:
xrow поля сущности (выбранная строка датагрида)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16124 / 11248 / 2888
Регистрация: 21.04.2018
Сообщений: 33,082
Записей в блоге: 2
25.05.2021, 22:36
Цитата Сообщение от Victusic Посмотреть сообщение
Можете пожалуйста уточнить, что вы имеете ввиду под "ТипЭлементаКоллекции"
По нормальному у вас должна быть привязка к коллекции <DataGrid ItemsSource"{Binding СвойствоКоллекция}" .../>.
Если делаете через задницу, то значит прямо её задаёте dataGrid.ItemsSource = коллекция;.
Вот это СвойствоКоллекция или коллекция типизирована каким-то типом.
Каким - я не могу знать.
Это вы должны сами знать.
Вот к этому типу и надо приводить содержимое (Контекст) строки, к которому привязан параметр команды.
0
 Аватар для Andrey-MSK
3336 / 2223 / 387
Регистрация: 14.08.2018
Сообщений: 7,494
Записей в блоге: 4
26.05.2021, 10:45
Более правильный вариант с MouseDoubleClick
XAML - добавляем в DataGrid следующее
XML
1
2
3
4
5
                <DataGrid.InputBindings>
                    <MouseBinding MouseAction="LeftDoubleClick"
                                  Command="{Binding DetailsCommand}" 
                                  CommandParameter="{Binding SelectedItem, ElementName=drawsGrid}"/>
                </DataGrid.InputBindings>
Рисуем команду во ViewModel окна
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public partial class MyWindowVM
    {
        private ICommand _detailsCommand;
        
        private void DetailsExecuted(DrawReport report)
        {
            // Тут делаем что надо при двойном клике мышкой
            // у меня открывается другое окно с небходимыми данными
            WindowService.ShowWindow(new DrawDetailsReportVM(report.IDDraw));
        }
        private static bool DetailsCanExecute(DrawReport arg) => arg != null;
 
        public ICommand DetailsCommand => _detailsCommand ??
            (_detailsCommand = new RelayCommand<DrawReport>(DetailsExecuted, DetailsCanExecute));
    }
И вспомогательный класс RelayCommand для команд
C#
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using System;
using System.Windows.Input;
 
namespace VModels
{
    public class RelayCommand : ICommand
    {
        private readonly Action<object> _execute;
        private readonly Func<object, bool> _canExecute;
 
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
        public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            this._execute = execute;
            this._canExecute = canExecute;
        }
        public bool CanExecute(object parametr)
        {
            return this._canExecute == null || this._canExecute(parametr);
        }
        public void Execute(object parametr)
        {
            this._execute(parametr);
        }
    }
    public class RelayCommand<T> : ICommand
    {
        private readonly Action<T> _execute;
        private readonly Func<T, bool> _canExecute;
 
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
        public RelayCommand(Action<T> execute, Func<T, bool> canExecute = null)
        {
            _execute = execute;
            _canExecute = canExecute;
        }
        public bool CanExecute(T parameter)
            => _canExecute?.Invoke(parameter) ?? true;
 
        public void Execute(T parameter)
            => _execute(parameter);
 
        public bool CanExecute(object parameter)
            => CanExecute(parameter is T t ? t : default);
 
        public void Execute(object parameter)
            => Execute(parameter is T t ? t : default);
    }
}
Усё
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.05.2021, 10:45
Помогаю со студенческими работами здесь

При нажатии на кнопку текст появляется , при повторном нажатии пропадает
Написать программу где есть кнопка и при нажатии на кнопку первый раз какой-то текст появился и...

Как при нажатии на кнопку закрыть DataGrid или DataGridView
как при нажатии на кнопку закрыть DataGrid или DataGridView ? не скрыть то есть чтобы вызывалось...

DataGrid при нажатии на кнопку
Добрый день, очень нужна ваша помощь &lt;DataGrid x:Name=&quot;goods_all&quot; Margin=&quot;10 0 0 0&quot; ...

Как при нажатии на кнопку уменьшить числовое значение определенного столбца выбранной строки в DataGrid
Имеется кнопка на форме, а также таблица. В таблице выбран SelectionMode=FullRowSelect; Когда...

Как сделать чтобы при нажатии на кнопку открылся окно для выбора папки и по нажатии на ок сохранился файл в папку
C# как сделать чтобы при нажатии на кнопку открылся окно для выбора папки и по нажатии на кнопку ок...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru