【问题标题】:Remove row from DataGridView in WPF从 WPF 中的 DataGridView 中删除行
【发布时间】:2015-02-06 21:30:32
【问题描述】:

遇到问题,我有一个数据网格,列如下 一,二,乘

我可以删除行购买单击键盘上的 del KEY 但是当我尝试编写我自己的删除功能时它不起作用 我得到的消息是

PresentationFramework.dll 中出现“System.InvalidOperationException”类型的未处理异常

附加信息:使用 ItemsSource 时操作无效。改为使用 ItemsControl.ItemsSource 访问和修改元素。

这是我的代码:

private void buttonRemove_Click(object sender, RoutedEventArgs e)
{
    NumberData.Items.Remove(NumberData.SelectedItems); 

}

public class Numbers : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged; 

    private double? _one;
    private double? _two;
    private double? _multiply;
    public double? One { get { return _one; } set { _one = value; UpdateValue(); } }
    public double? Two { get { return _two; } set { _two = value; UpdateValue(); } }
    public double? Multiply
    {
        get { return _multiply; }
        set
        {
            _multiply = value; UpdateValue();
        }
    }

    public Numbers(double? pOne, double? pTwo)
    {
        _one = pOne;
        _two = pTwo;
        _multiply = GetMultiply(); 
    }

    private void UpdateValue()
    {
        _multiply = GetMultiply();

        OnPropertyChanged("One");
        OnPropertyChanged("Two");
        OnPropertyChanged("Multiply");
    }

    private double? GetMultiply()
    {
        return _one * _two;
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

public class Collection :  ObservableCollection<Numbers>  
{
    public ObservableCollection<Numbers> Numbers { get; set; }      

    public Collection()
    {
        Numbers = new ObservableCollection<Numbers>();

        //Numbers.Add(new Numbers(1, 2));
        //Numbers.Add(new Numbers(2, 2)); 
    }

    public void AddNumbers(double pOne, double pTwo)
    {
        Numbers.Add(new Numbers(pOne,pTwo));
    }

    public void AddNumbersRow()
    {
        Numbers.Add(new Numbers(null, null));
    }
}

<Grid>
    <DataGrid x:Name="NumberData" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top" ItemsSource="{Binding}" AutoGenerateColumns="False" LostFocus="StockData_LostFocus" >
        <DataGrid.Columns >
            <DataGridTextColumn Header="Number One" Width="100" Binding="{Binding One, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=\{0:C\}}" />
            <DataGridTextColumn Header="Number Two" Width="100" Binding="{Binding Two, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=\{0:C\}}" />
            <DataGridTextColumn Header="Total" Width="100" Binding="{Binding Multiply, BindsDirectlyToSource=True, Mode=TwoWay, StringFormat=\{0:C\}, UpdateSourceTrigger=PropertyChanged}" />
        </DataGrid.Columns>
    </DataGrid>
    <Button x:Name="buttonSave" Content="Save" HorizontalAlignment="Left" Margin="411,11,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
    <Button x:Name="buttonAddRow" Content="Add Row" HorizontalAlignment="Left" Margin="411,49,0,0" VerticalAlignment="Top" Width="75" Click="buttonAddRow_Click"/>
    <Button x:Name="buttonRemove" Content="Remove" HorizontalAlignment="Left" Margin="411,88,0,0" VerticalAlignment="Top" Width="75" Click="buttonRemove_Click"/>
</Grid>

【问题讨论】:

  • 您拥有所有这些绑定,而且您不只是修改 ObservableCollection?:为什么???
  • 不确定您的建议。所以如果你解释一下,也许这就是我应该做的。
  • “它不起作用” 不是很具体或描述性的。你有例外吗?
  • 是的,我确实遇到了异常 - > PresentationFramework.dll 中发生了“System.InvalidOperationException”类型的未处理异常附加信息:使用 ItemsSource 时操作无效。改为使用 ItemsControl.ItemsSource 访问和修改元素。

标签: c# wpf xaml


【解决方案1】:

看起来你已经把所有东西都设置好了,只是有点奇怪:

<DataGrid ItemsSource="{Binding}">

不确定为什么 ItemsSource 是 DataContext。 DataContext 应该是一个带有一些 ObservableCollection 属性的 View Model 类,然后您可以将其绑定到。

但除此之外,既然您说您的代码正在运行; 您不应该像那样手动删除项目

您的按钮应该绑定到一个命令,该命令会转到视图模型并修改绑定的集合。示例如下所示:

myObservableCollection.RemoveAt(0);

由于它是ObservableCollection,因此修改将传播到 UI。

【讨论】:

  • 非常感谢,您给了我工作思路。我解决了。
【解决方案2】:

非常感谢,我从您的回答中得到了想法,这是我为删除该项目所做的工作

if (NumberData.SelectedIndex == -1)
       {
           System.Windows.MessageBox.Show("nothing selected");

       }
       else
       {
           int indexSelected = Convert.ToInt32(NumberData.SelectedIndex);
           mycollection.Numbers.RemoveAt(indexSelected);
       }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 2016-08-02
    • 2016-08-15
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多