【问题标题】:Delete Datagrid row (WPF)删除数据网格行 (WPF)
【发布时间】:2017-02-07 06:06:13
【问题描述】:

应用程序的主窗口具有从数据库填充的数据网格。 (从数据表中绑定数据网格)。

数据网格有 3 列-

<DataGrid.Columns>
<DataGridTextColumn Header= Id" Binding="{Binding Id}" Width="250"></DataGridTextColumn>
<DataGridTextColumn Header= Name" Binding="{Binding Name}" Width="250"></DataGridTextColumn>
<DataGridTemplateColumn Header="Action" Width="*">
         <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
         <StackPanel Orientation="Horizontal">
             <Button Name="btnEdit" Content="Edit" Width="90" Click="btnEdit_Click" />
             <Button Name="btnDelete" Content="Delete" Width="90" Click="btnDelete_Click" />
         </StackPanel>
        </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
</DataGrid.Columns>

当窗口加载的时候,datagrid填充了数据表。

    DataTable o_DataTable = new DataTable();
    o_DataTable.Columns.Add("Id", typeof(string));
    o_DataTable.Columns.Add("Name", typeof(string));

            o_DataTable.Rows.Add("1","A");
            o_DataTable.Rows.Add("2","B");

        this.grd.ItemsSource = o_DataTable.DefaultView;

点击删除按钮的代码如下:

private void Button_Click(object sender, RoutedEventArgs e)
        {
            object item = grd.SelectedItem;
            string CourseName = (grd.SelectedCells[0].Column.GetCellContent(item) as TextBlock).Text;
            MessageBoxResult result = MessageBox.Show("Are you sure you want to delete the course " + CourseName + "?");
            if (result == MessageBoxResult.OK)
            {
                grd.Items.RemoveAt(grd.SelectedIndex);
            }
        } 

当我点击删除按钮时抛出异常

An unhandled exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll

Additional information: Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.

请任何人提出任何想法来克服此错误。 谢谢。

【问题讨论】:

    标签: c# wpf binding datatable datagrid


    【解决方案1】:

    你想从网格中删除项目你可以试试这个方法

     private void btnDelete_Click(object sender, RoutedEventArgs e)
            {
                object item = grd.SelectedItem;
                string CourseName = (grd.SelectedCells[0].Column.GetCellContent(item) as TextBlock).Text;
                MessageBoxResult result = System.Windows.MessageBox.Show("Are you sure you want to delete the course " + CourseName + "?");
                if (result == MessageBoxResult.OK)
                {
                    var itemSource = grd.ItemsSource as DataView;
    
                    itemSource.Delete(grd.SelectedIndex);
    
                    grd.ItemsSource = itemSource;
                }
            }
    

    【讨论】:

      【解决方案2】:

      而不是做:

      grd.Items.RemoveAt(grd.SelectedIndex);
      

      您应该从底层源中删除。

      尝试将其从数据表中删除,它将从视图中消失。采用 MVVM 方法更容易,因为您无需触摸 UI。

      【讨论】: