C#使用动态文本框/按钮/网格删除行
我已经测试了一些想法与动态文本框和按钮,添加项目到我的网格工作得很好,但如果我想删除它有一些错误,有时1行是空的,我的添加按钮消失或我的程序崩溃.
我错了什么或错过了什么? C#代码: public MainWindow() { InitializeComponent(); } int Numberic = 0; private void NewButton_Click(object sender,RoutedEventArgs e) { #region Row and Numberic Numberic++; RowDefinition ROW = new RowDefinition(); GridLength Height = new GridLength(59); ROW.Height = Height; MainGrid.RowDefinitions.Add(ROW); #endregion #region Set new Button Location int ButtonLocation = Grid.GetRow(NewButton); Grid.SetRow(NewButton,ButtonLocation + 1); #endregion #region Create TextBox TextBox CreateTextBox = new TextBox(); CreateTextBox.Name = "NewTextBox_" + Numberic; CreateTextBox.Width = 438; CreateTextBox.Height = 35; CreateTextBox.Margin = new Thickness(53,12,0); CreateTextBox.HorizontalAlignment = HorizontalAlignment.Left; CreateTextBox.VerticalAlignment = VerticalAlignment.Top; CreateTextBox.FontSize = 15; CreateTextBox.HorizontalContentAlignment = HorizontalAlignment.Left; CreateTextBox.VerticalContentAlignment = VerticalAlignment.Center; MainGrid.Children.Add(CreateTextBox); Grid.SetRow(CreateTextBox,ButtonLocation); #endregion #region Create Button Button CreateButton = new Button(); CreateButton.Name = "NewButton_" + Numberic; CreateButton.Width = 35; CreateButton.Height = 35; CreateButton.Margin = new Thickness(12,0); CreateButton.HorizontalAlignment = HorizontalAlignment.Left; CreateButton.VerticalAlignment = VerticalAlignment.Top; CreateButton.Content = "-"; CreateButton.FontSize = 20; CreateButton.FontWeight = FontWeights.Bold; BrushConverter BC = new BrushConverter(); CreateButton.Background = (Brush)BC.ConvertFrom("#FFDB0000"); CreateButton.Foreground = Brushes.White; CreateButton.BorderBrush = Brushes.Transparent; CreateButton.Click += new RoutedEventHandler(Delete_OnClick); MainGrid.Children.Add(CreateButton); Grid.SetRow(CreateButton,ButtonLocation); #endregion } private void Delete_OnClick(object sender,RoutedEventArgs e) { Button SelectedButton = (Button)sender; int SelectedRow = Grid.GetRow(SelectedButton); string[] Number = SelectedButton.Name.Split('_'); string TextBoxName = "NewTextBox" + "_" + Number[1]; TextBox SelectedTextbox = (TextBox)LogicalTreeHelper.FindLogicalNode(MainGrid,TextBoxName); MainGrid.Children.Remove(SelectedTextbox); MainGrid.Children.Remove(SelectedButton); //Numberic--; MainGrid.RowDefinitions.RemoveAt(SelectedRow); } XAML代码: <Grid Name="MainGrid" ShowGridLines="True" OpacityMask="Black" Background="#FFEDEDED"> <Grid.RowDefinitions> <RowDefinition Height="59" /> </Grid.RowDefinitions> <Button Content="+" Height="35" HorizontalAlignment="Left" Margin="12,0" Name="NewButton" VerticalAlignment="Top" Width="35" BorderBrush="{x:Null}" Foreground="White" Background="#FF727272" FontWeight="Bold" FontSize="20" Click="NewButton_Click" /> </Grid> 谢谢, 解决方法
当项目数量可以更改时,WPF的ItemsControl是在视图中显示项目的正确方法.
许多控件继承自ItemsControl,如ComboBox本身,或DataGrid,或ListBox ……但在这个例子中,我将直接使用ItemsControl,因为你要做的事情不需要任何额外的功能. 首先,XAML: <Grid Name="MainGrid" OpacityMask="Black" Background="#FFEDEDED"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <ItemsControl x:Name="MyItemsControl"> <ItemsControl.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <Button Content="-" Height="35" HorizontalAlignment="Left" Margin="12,0" Name="NewButton" VerticalAlignment="Top" Width="35" BorderBrush="{x:Null}" Foreground="White" Background="#FFDB0000" FontWeight="Bold" FontSize="20" Click="Delete_OnClick" /> <TextBox Width="438" Height="35" Margin="6,0" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="15" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" /> </StackPanel> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> <Button Grid.Row="1" Content="+" Height="35" HorizontalAlignment="Left" Margin="12,0" Name="NewButton" VerticalAlignment="Top" Width="35" BorderBrush="{x:Null}" Foreground="White" Background="#FF727272" FontWeight="Bold" FontSize="20" Click="NewButton_Click" /> </Grid> 我已将“ – ”按钮和TextBox的定义放在ItemTemplate中.对于我们添加到其中的每个项目,ItemsControl将重用此模板. 现在,代码隐藏: public partial class MainWindow : Window { int Numberic = 0; private void NewButton_Click(object sender,RoutedEventArgs e) { var item = new Item(); item.Id = ++Numberic; MyItemsControl.Items.Add(item); } private void Delete_OnClick(object sender,RoutedEventArgs e) { Button SelectedButton = (Button)sender; var item = SelectedButton.DataContext; MyItemsControl.Items.Remove(item); } } 正如您所看到的,这比您之前的方法更简单,更清晰.大多数逻辑由ItemsControl处理,您只需要向其中添加和删除项目. 我已经为ItemsControl的项目使用了自定义类(Item),但它可以是你想要的任何东西.在这种情况下,Item的定义只是: public class Item { public int Id { get; set; } } 检查在Delete_OnClick方法中我是否使用DataContext属性来检索当前的Item实例. 这是因为当你将一个对象添加到ItemsControl时,它会使用它的可视化表示(我们在模板中定义,在这种情况下)创建相应的“可视项目”,并将添加的对象指定为此“可视项目”的DataContext “和控制.这样你就可以直接创建Bindings到它的属性等. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |