При нажатии кнопки, делая несколько ячеек доступными для редактирования в выбранной строке ReadOnly DataGrid - PullRequest
0 голосов
/ 09 мая 2020

Вопрос : в ReadOnly DataGrid, как мы можем разместить несколько ячеек в выбранной строке в режиме редактирования?

В следующем ReadOnly DataGrid, * 1007 Событие * (показано ниже) успешно помещает ячейку столбца FirstName выбранной строки в режим редактирования. Но мне нужны ячейки столбца FirstName и LastName в режиме редактирования. Если я заключу весь код этого события в for loop как for (int i=2; i <=3; i++){...}, только последняя ячейка (LastName) столбец получит режим редактирования.

Примечание :

  1. Все остальные строки должны оставаться в режиме ReadOnly, когда пользователь редактирует выбранную строку.
  2. Я использую Entity Framework Core для операций с базами данных (например, MyDataGrid .ItemsSource = db.Customers.ToList (); et c) и .NET Core 3.1, VS2019 последняя версия.
  3. Не используется MVVM.
  4. Это - аналогичный пост, но для столбца (не для строки).
  5. Для краткости показаны только два столбца. В реальном сценарии более двух столбцов.

DataGrid :

<DataGrid x:Name="MyDataGrid" IsReadOnly="True" SelectionMode="Single" AutoGenerateColumns="False" Margin="0,25,0,0">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Edit">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button x:Name="btnEdit" Content="Edit" Click="btnEdit_Click"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="ID" Visibility="Collapsed" Binding="{Binding CustomerId}" />
        <DataGridTextColumn Header="FirstName" Binding="{Binding FirstName}" />
        <DataGridTextColumn Header="LastName" Binding="{Binding LastName}" />
    </DataGrid.Columns>
</DataGrid>

Код :

private void btnEdit_Click(object sender, RoutedEventArgs e)
{
    DataGridCell dataGridCell;
    MyDataGrid.CurrentCell = new DataGridCellInfo((sender as Button).DataContext, MyDataGrid.Columns[2]);
    var cellContent = MyDataGrid.CurrentCell.Column.GetCellContent(MyDataGrid.CurrentCell.Item);
    if (cellContent != null)
    {
        dataGridCell = (DataGridCell)cellContent.Parent;
        dataGridCell.IsEditing = true;
    }
}

1 Ответ

1 голос
/ 09 мая 2020

Вы можете помещать только одну ячейку в режим редактирования за раз независимо от того, что свойство DataGrid IsReadOnly имеет значение True или False.

Если вы хотите разрешить пользователям редактировать ячейки указанного c в строке после нажатия кнопки «Изменить» вы можете обратиться к приведенному ниже коду:

XAML:

<DataGrid x:Name="MyDataGrid" SelectionMode="Single" IsReadOnly="True" AutoGenerateColumns="False" Margin="0,25,0,0"
          SelectedCellsChanged="MyDataGrid_SelectedCellsChanged" SelectionUnit="Cell">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Edit">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button x:Name="btnEdit" Content="Edit" Click="btnEdit_Click"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="ID" Visibility="Collapsed" Binding="{Binding CustomerId}" />
        <DataGridTextColumn Header="FirstName" Binding="{Binding FirstName}" />
        <DataGridTextColumn Header="LastName" Binding="{Binding LastName}" />
    </DataGrid.Columns>
</DataGrid>

Код позади:

    private Customer _editableCustomer;
    private void btnEdit_Click(object sender, RoutedEventArgs e)
    {
        _editableCustomer = (Customer)MyDataGrid.SelectedCells.First().Item;
    }

    private void MyDataGrid_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
    {
        if (e.AddedCells.First().Item == _editableCustomer)
            GetDataGridCell(MyDataGrid.SelectedCells.First()).IsEditing = true;
    }

    public static DataGridCell GetDataGridCell(DataGridCellInfo cellInfo)
    {
        var cellContent = cellInfo.Column.GetCellContent(cellInfo.Item);
        if (cellContent != null)
            return (DataGridCell)cellContent.Parent;

        return null;
    }

Однако лично я не стал бы этого делать. Я бы установил для свойства DataGrid IsReadOnly значение False и добавил бы обработчик событий для события BeginningEdit DataGrid. Тогда я мог бы делать все, что захочу, в обработчике событий до того, как пользователь редактирует строки.

...