簡體   English   中英

在 WPF DataGrid 中刪除一行

[英]Delete a row in WPF DataGrid

我有一個數據網格,其中一個列是刪除圖標,另一列是更新圖標。 單擊更新時,第一個單元格設置為焦點。

單擊刪除時,我想刪除所選的行,但出現錯誤“在使用 ItemsSource 時操作無效。改為使用 ItemsControl.ItemsSource 訪問和修改元素。” 使用以下代碼:

XAML:

<DataGrid Name="grdList" Margin="3,16,0,5" RowHeight="30" ColumnWidth="*"
          ItemsSource="{Binding  List,Mode=TwoWay}" Width="434" 
          AutoGenerateColumns="False" 
          CanUserAddRows="False" AlternatingRowBackground="#FFB9BBFF">
    <DataGrid.Columns>
        <DataGridTextColumn MinWidth="0" Header="Property"
                            Binding="{Binding Path=Property}"/>

        <DataGridTemplateColumn Header="Update"  MinWidth="50" MaxWidth="50">
            <DataGridTemplateColumn.CellStyle>
                <Style TargetType="DataGridCell">
                    <EventSetter Event="PreviewMouseLeftButtonDown"
                                 Handler="EventSetter_OnHandler"/>
                </Style>
            </DataGridTemplateColumn.CellStyle>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image Source="Icons/Update.jpg"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Header="Delete"  MinWidth="50" MaxWidth="50">
            <DataGridTemplateColumn.CellStyle>
                <Style TargetType="DataGridCell">
                    <EventSetter Event="PreviewMouseLeftButtonDown"
                                 Handler="EventSetter_OnHandler"/>
                </Style>
            </DataGridTemplateColumn.CellStyle>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Image Source="Icons/Delete.jpg"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

C#:

private void EventSetter_OnHandler(object sender, MouseButtonEventArgs e)
{
    object source = e.OriginalSource;
    if (source.GetType() == typeof(Image))
    {
        grdList.IsReadOnly = false;

        selectedRow = FindParent<DataGridRow>(sender as DependencyObject);

        if (((DataGridCell)sender).Column.Header.ToString().ToUpperInvariant() == "DELETE")
        {
            grdList.Items.Remove(selectedRow);
        }
        else
        {
            DataGridCellsPanel panel = FindVisualChild<DataGridCellsPanel>(selectedRow);

            DataGridCell dgc = panel.Children[0] as DataGridCell; 
            dgc.Focus();
            grdList.BeginEdit();

            e.Handled = true;
        }
    }
}

還有如何使用“刪除”鍵以及單擊刪除單元格添加刪除功能。

我懷疑在DeleteEventSetter_OnHandler ,您必須從 dataGrid 的Items集合中刪除項目。 像這樣的東西:

grdList.Items.Remove(someItem);

但由於錯誤是不言自明的

“使用 ItemsSource 時操作無效。請改為使用 ItemsControl.ItemsSource 訪問和修改元素。”

您已將 ItemsSource 綁定到某個集合,因此您需要從中刪除項目。 將 ItemsSource 與 some collection 綁定時,不能直接修改 Items 集合 它應該是這樣的:

List.Remove(someItem);

嘗試這個,

grdList.Items.RemoveAt(grdList.SelectedIndex);

您可以將DataGrid的 SelectedItem 綁定到一個屬性。 然后你可以打電話

List.Remove(SelectedDataGridItem);

SelectedDataGridItem 是 Selected Item 綁定的屬性

我有同樣的問題,我解決了它:

yourrowbindingobject row = (yourrowbindingobject)yourdatagrid.SelectedItems[0];

ObservableCollection<yourrowbindingobject> data = (ObservableCollection<yourrowbindingobject>)yourdatagrid.ItemsSource;
data.Remove(row);

我在嘗試使用按鈕單擊刪除數據網格行時遇到了同樣的問題,我解決了如下問題:

由從 SQL 數據庫檢索的數據填充的 Datagrid 行:

/* Assign ItemsSource of DataGrid. */
dataGridSupplier.ItemsSource = Ldtbl.DefaultView;

 DataRowView dr = dataGridSupplier.SelectedItem as DataRowView;
 DataRow dr1 = dr.Row;

/* Remove selected item from the datagrid after successfully updating database. */
Ldtbl.Rows.Remove(dr1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM