none
DataGrid 添加删除按钮获取行问题 RRS feed

  • 问题

  •  <DataGrid x:Name="DataGrid1" AutoGenerateColumns="False" ItemsSource="{Binding}" IsReadOnly="False" >
                    <DataGrid.Columns> 
    <DataGridTemplateColumn >
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                   <Button  x:Name="btnDelete" Click="btnDelete_Click"  Width="40" HorizontalAlignment="Right" Height="30" Content="删除"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
    
                    </DataGrid.Columns>
                </DataGrid>
    

    DataGrid 添加删除按钮事件:

     private void btnDelete_Click(object sender, RoutedEventArgs e)
    {
      var curItem = (????) DataGrid1.ContainerFromElement((Button)sender);
                DataRowView drv = curItem as DataRowView;
    }
    
    
    


    如果是ListBox问号的地方可以用ListBoxItem转换,可以在强制as DataRowView;
    那DataGrid ,怎么办呢?

    最终是要获取点击按钮所在的项,就是我要得到DataRowView drv = curItem as DataRowView;

    ===========

    排除DataGridHyperlinkColumn或复选框等删除方式。

    2011年11月25日 11:45

答案

  • 这是我的方法。

    dgImport是DataGrid.

                    if (MessageBox.Show("您确定要删除本行吗?", "注意", MessageBoxButton.YesNo, MessageBoxImage.Information) == MessageBoxResult.Yes)
                    {
                        int selectIndex = dgImport.SelectedIndex;
                        if (selectIndex < 0)
                        {
                            MessageBox.Show("请选中删除行!", "注意", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            return;
                        }
                        ICollectionView view = (ICollectionView)CollectionViewSource.GetDefaultView(dgImport.ItemsSource);
                        List<Import> items = new List<Import>();
                        items = (List<Import>)view.SourceCollection;
                        if (selectIndex > items.Count - 1)
                        {
                            selectIndex -= 1;
                        }
                        if (selectIndex > -1)
                        {
                            items.RemoveAt(selectIndex);
                        }
                        dgImport.Items.Refresh();
                    }

    • 已标记为答案 WCF小Q 2011年11月28日 19:09
    2011年11月26日 5:31
  • 参考:

    private void btnDelete_Click(object sender, RoutedEventArgs e)
    {
        Person obj = ((FrameworkElement)sender).DataContext as Person;
        test.Remove(obj);
        DataGrid1.ItemsSource = null;
        DataGrid1.ItemsSource = Persons;
    } 
    

    Person是类,也就是你的DataGrid的其中一个Item,Persons就是这个Item的集合:

    ObservableCollection<Person> test = new ObservableCollection<Person>();
    

    然后,你先得到这个Item,然后从集合中删除,然后重置ItemsSource。

    我没测试MaJiXiang的代码, 你可以尝试一下,他是先遍历index,然后根据Index删除。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 WCF小Q 2011年11月28日 19:09
    2011年11月28日 10:40
    版主

全部回复

  • 这是我的方法。

    dgImport是DataGrid.

                    if (MessageBox.Show("您确定要删除本行吗?", "注意", MessageBoxButton.YesNo, MessageBoxImage.Information) == MessageBoxResult.Yes)
                    {
                        int selectIndex = dgImport.SelectedIndex;
                        if (selectIndex < 0)
                        {
                            MessageBox.Show("请选中删除行!", "注意", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                            return;
                        }
                        ICollectionView view = (ICollectionView)CollectionViewSource.GetDefaultView(dgImport.ItemsSource);
                        List<Import> items = new List<Import>();
                        items = (List<Import>)view.SourceCollection;
                        if (selectIndex > items.Count - 1)
                        {
                            selectIndex -= 1;
                        }
                        if (selectIndex > -1)
                        {
                            items.RemoveAt(selectIndex);
                        }
                        dgImport.Items.Refresh();
                    }

    • 已标记为答案 WCF小Q 2011年11月28日 19:09
    2011年11月26日 5:31
  • 谢谢 MaJiXiang

    你的方法不是我想要的,

    我的删除按钮是放在<DataGridTemplateColumn.CellTemplate>
                                <DataTemplate>
                                   <Button  x:Name="btnDelete" Click="btnDelete_Click"  Width="40" HorizontalAlignment="Right" Height="30" Content="删除"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>中。

    然后在Click="btnDelete_Click" 执行删除操作

    2011年11月26日 6:09
  • 放在Template用这个也没影响啊。你把我的代码放到你的btnDelete_Click事件中,我刚才写的就是如何获取选中项以及再删除时的一些逻辑判断。

    2011年11月26日 7:27
  • 参考:

    private void btnDelete_Click(object sender, RoutedEventArgs e)
    {
        Person obj = ((FrameworkElement)sender).DataContext as Person;
        test.Remove(obj);
        DataGrid1.ItemsSource = null;
        DataGrid1.ItemsSource = Persons;
    } 
    

    Person是类,也就是你的DataGrid的其中一个Item,Persons就是这个Item的集合:

    ObservableCollection<Person> test = new ObservableCollection<Person>();
    

    然后,你先得到这个Item,然后从集合中删除,然后重置ItemsSource。

    我没测试MaJiXiang的代码, 你可以尝试一下,他是先遍历index,然后根据Index删除。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 WCF小Q 2011年11月28日 19:09
    2011年11月28日 10:40
    版主