WPF:如何通过行之一单元格中的按钮删除网格中的行?

问题描述 投票:0回答:1

这是添加一行包含四个元素的代码:

private void ItemAdd(object sender, RoutedEventArgs e)
{
    Button deleteButton = new Button { Visibility = Visibility.Visible, Content = "X" };
    TextBox itemName = new TextBox { MinHeight = 10, MaxHeight = 40 };
    TextBox weight = new();
    Label number = new Label();
    RowDefinition row = new()
    { Height = GridLength.Auto, MinHeight = 10 };
    currentRow = row;
    NamesList.RowDefinitions.Add(row);
    number.Content = GetCurrentRowIndex(NamesList, row) - 1;
    AddAt(NamesList, number, GetCurrentRowIndex(NamesList, row), 0);
    AddAt(NamesList, itemName, GetCurrentRowIndex(NamesList, row), 1);
    AddAt(NamesList, weight, GetCurrentRowIndex(NamesList, row), 2);
    AddAt(NamesList, deleteButton, GetCurrentRowIndex(NamesList, row), 3);
/*also i have this for deleting row, but next going method that not work*/
        void DeleteCurrentRow(Grid grid, RowDefinition row)
        {
            grid.RowDefinitions.Remove(row);
        }
}

我尝试为假设的当前行插入变量

RowDefinition currentRow;
但没用

c# wpf
1个回答
0
投票

RowDefinition
只是一个描述网格布局的布局对象。它不会映射到实际元素或渲染的网格行。
RowDefinition
告诉
Grid
它有一行具有特定属性 - 它是一个描述符。如果删除定义,元素仍然是
Grid
的子元素,因此可见。

除非您通过行索引跟踪元素,例如使用地图,否则必须通过查询附加的

Grid.Children
属性来过滤
Grid.Row
集合:

void DeleteCurrentRow(Grid grid, RowDefinition rowDefinition)
{
  // Consider to pass in the row index instead of the RowDefinition object
  int indexOfRowToRemove = grid.RowDefinitions.IndexOf(rowDefinition);
  IEnumerable<UIElement> rowElements = grid.Children
    .Cast<UIElement>()
    .Where(element => Grid.GetRow(element) == indexOfRowToRemove);
  
  foreach (var rowElement in rowElements)
  {
    grid.Children.Remove(rowElement);
  }
}

如果您必须使用数据表,您应该更喜欢

DataGrid
Grid
用于排列 UI 布局的 UI 元素,而不是显示数据。

在 WPF 中,您总是更喜欢在 XAML 中创建布局,因为它更容易。您无法在学习 WPF 的同时避免 XAML。当你以后开始学习XAML时你会后悔的。

© www.soinside.com 2019 - 2024. All rights reserved.