在我的C#/ WPF应用程序中,我有一个ListView
控件,我填充如下:
private void Load()
{
DbSet<recordHistory> recordHistory = _db.recordHistories;
var query = from cbHistory in recordHistory
orderby cbHistory.id descending
select new { cbHistory.id, cbHistory.Content, cbHistory.Size, cbHistory.DateAdded };
crRecordHistoryList.ItemsSource = query.ToList();
}
以上工作符合预期。我的ListView
控件填充了SQL数据库中的所有已保存记录。
当我开始调试应用程序时,它会按预期执行。但是,当我选择其中一个ListView
项目(无论我选择哪个项目)并点击Remove
按钮时,只会从数据库中删除第一条记录 ListView控件。
预期的行为是从数据库&amp;中删除选定的记录。 listview控件...
我的Remove
方法
private void Button_Remove_Click(object sender, RoutedEventArgs e)
{
foreach (var record in _db.recordHistories.Local.ToList())
{
Console.WriteLine("Removing Record Id:" + record.id);
_db.recordHistories.Remove(record);
}
_db.SaveChanges();
this.crRecordHistoryList.Items.Refresh();
this.Load();
}
此外,所有后续项目选择和单击删除按钮都不会导致从数据库/列表视图控件中删除任何内容。
我还在Remove
方法中尝试了以下内容(只是为了获取ID):
Console.WriteLine("Removing Record Id:" + (crRecordHistoryList.SelectedItem as recordHistory).id);
在这种情况下,我得到:
System.NullReferenceException:&#39;对象引用未设置为对象的实例。&#39;
我的recordHistory
课程(自动生成)
using System;
using System.Collections.Generic;
public partial class recordHistory
{
public int id { get; set; }
public string Content { get; set; }
public string Size { get; set; }
public Nullable<int> DateAdded { get; set; }
}
编辑:我已经想出为什么它只删除了第一条记录,然后没有其他事情发生(无论选择哪个项目)......这是因为从Local
获取记录(在我的foreach
声明中),我应该简单地进行以下操作 - 这是我最初的尝试,试图将ID输出到Console
:< / p>
private void Button_Remove_Click(object sender, RoutedEventArgs e)
{
recordHistory testRecord = new recordHistory();
testRecord.id = (recordHistory)crRecordHistoryList.SelectedItem;
_db.recordHistories.Attach(testRecord);
_db.recordHistories.Remove(testRecord);
_db.SaveChanges();
this.crRecordHistoryList.Items.Refresh();
this.Load();
}
但是,以下一行
testRecord.id = (recordHistory)crRecordHistoryList.SelectedItem;
正在抛出错误:
无法隐式转换类型&#39; recordHistory&#39;到&#39; int&#39;
顺便说一下:如果我用第testRecord.id = 85;
替换第二行,上面的方法就会完美。
因此,我尝试将上述行更改为以下内容,但无济于事:
testRecord.id = System.Convert.ToInt32(crRecordHistoryList.SelectedItem);
如何删除所选记录?
答案 0 :(得分:0)
感谢@ pinkfloydx33指出我正确的方向。根据他的评论,我冒险进一步研究兔子洞,最终导致我创建了一个DTO课程并修改了我的Load
和Remove
方法,如下所示 -
Load
方法
private void Load()
{
List<HistoryRecordsDTO> records = (from record in _db.recordHistories
orderby record.id descending
select new HistoryRecordsDTO
{
id = record.id,
Content = record.Content,
Size = record.Size,
DateAdded = record.DateAdded
}).ToList();
crRecordHistoryList.ItemsSource = records;
}
Remove
方法
private void Button_Remove_Click(object sender, RoutedEventArgs e)
{
recordHistory record = new recordHistory();
record.id = (crRecordHistoryList.SelectedItem as HistoryRecordsDTO).id;
_db.recordHistories.Attach(record);
_db.recordHistories.Remove(record);
_db.SaveChanges();
this.crRecordHistoryList.Items.Refresh();
this.Load();
}
而且,我的DTO
班级 - HistoryRecordsDTO
public class HistoryRecordsDTO
{
public int id { get; set; }
public string Content { get; set; }
public string Size { get; set; }
public Nullable<int> DateAdded { get; set; }
}
执行上述操作解决了我删除所选ListView
项目的问题。
作为一名C#/ WPF新手,我确信在一般方面有更好的/最佳的/更好的...我期待其他答案并从中学习。