Кнопка в DataGrid

281
03 февраля 2018, 22:40

Доброго времени суток. К делу: в DataGrid, в таблицу нужно добавить столбик кнопок, это было сделано через DataGridTemplate. Во всех строчках (их n количество) лежит одна и та же кнопка, заранее определенная в коде xaml. При нажатии на нее нужно вернуть номер строчки в которой она находится. Как это можно было бы сделать в коде на с#?

Данным кодом я добавил кнопку в таблицу (xaml):

<DataGridTemplateColumn>
     <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
               <Button
                  x:Name="bToCorrect"
                  HorizontalContentAlignment="Center"
                  VerticalContentAlignment="Center"
                  Content="" Width="10" Height="10"
                  Click="ToCorrect_Click"
                  />
            </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

Так же, таблица имеет свой ItemSource:

main.dgTable.ItemsSource = WriteAndRead.ReadForTable(main.Title);

Этот код находится в классе решения.

Вот скриншот самой таблицы, то что у меня есть на данный момент: https://ibb.co/kEBpW6. Как вы можете видеть на скриншоте, в каждой строчке есть своя кнопка, но это одна кнопка, продублированная на все строчки. Мне нужно, чтобы при нажатии на кнопку она получала, либо уже содержала в себе номер строчки в которой на нее нажали. Помогите разобраться с этим.

Answer 1

Судя по вашему XAML Click="ToCorrect_Click" вы не пользуетесь командами и MVVM. Потому можно сделать так:

1) назначить имя для DataGrid

<DataGrid x:Name="_dataGridStations"

2) воспользоваться свойством Tag

<DataTemplate>
    <Button Content="?"
            Width="25"
            Height="25"
            Tag="{Binding SelectedIndex, ElementName=_dataGridStations}"
            Click="Button_Click"/>
</DataTemplate>

3) тогда в обработчике можно сделать так

private void Button_Click(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    int index = Int32.Parse(button.Tag.ToString());
    MessageBox.Show(index.ToString());
}

P.S. у контролов, которые отображают коллекции: ComboBox, ListBox, DataGrid есть ряд свойств: SelectedItem - выделенный элемент, SelectedIndex - индекс выделенного элемента, ItemsSource - собственно коллекция-источник для отображения. В третьей строке происходит привязка к свойству кнопки Tag индекса выбранного элемента в DataGrid. Если у вас какие-то проблемы, то где-то вы неправильно скопировали код. Это легко проверить, установите точку останова на строку int index = Int32.Parse(button.Tag.ToString()); и проверте значение button.Tag.ToString(). -1 может говорить о том, что был не выделен элемент в DataGrid.

READ ALSO
Дублирование элементов массива

Дублирование элементов массива

Создать функцию, которая принимает массив, а возвращает новый, с дублированными элементами, входного массиваУ меня такой код, но в нём ошибка,...

282
angular js datatables custom pagination [требует правки]

angular js datatables custom pagination [требует правки]

I have database that supports cursor pagination onlyI have formed dtOptions object for my table and I try to pass cursor on page click event $scope

272
Что не так с производительностью на мобильном Chrome?

Что не так с производительностью на мобильном Chrome?

Написал свое приложение на JavaScript и отправился его тестировать

323