gpt4 book ai didi

c# - 无法从数据网格 "Object reference not set to an instance of an object."更新项目

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:19 25 4
gpt4 key购买 nike

我的应用程序有问题,没有选择要使用 EF 更新的项目。

我正在创建一个应用程序供用户输入其组织的详细信息。看起来很简单。使用选项卡控件输入数据后,我有一个包含一系列数据网格的 View ,使用户能够更新,或者在需要时插入另一条数据,或者能够删除。

在我的 View 模型中,我有一系列不同的东西(这可能不是实现 MVVM 的最佳方式,但最终会尝试实现)。

我的属性实现了 INOTIFYPROPERTYCHANGE。保存、更新和删除的命令。还有我的实体方法(使用 Entity Framework 的 CRUD 操作 - 稍后当我了解更多关于 MVVM 等时将使用 Repository 系统)。

到目前为止,我不得不使用 View 的代码隐藏来加载我的数据,它完美地工作(显然我不应该这样做,所以任何建议向我展示否则将不胜感激)像这样;

    private void Page_Loaded(object sender, RoutedEventArgs e)
{
DBEntities context = new DBEntities();

var orgTypeDetails = (from o in context.OrganisationTypeDetails
select o).ToList();

dgOrgTypeDetail.ItemsSource = orgTypeDetails;
}

我还有一个事件处理程序,它只允许您选择一行,然后更新该特定行;

    private void btnUpdateOrgTypeDetail_Click(object sender, RoutedEventArgs e)
{
OrganisationTypeDetailViewModel org = new OrganisationTypeDetailViewModel();

OrganisationTypeDetail selected = dgOrgTypeDetail.SelectedItem as OrganisationTypeDetail;

if (selected == null)
MessageBox.Show("You must select a 'Type' before updating.");
else
{
OrganisationTypeDetailUpdateView update = new OrganisationTypeDetailUpdateView();

update.ShowDialog();
org.UpdateOrganisationTypeDetail(selected);
Page_Loaded(null, null);
}
}

最后,我的方法是使用来自 View 模型的 EF 更新表格;

    public void UpdateOrganisationTypeDetail(OrganisationTypeDetail orgTypeDetail)
{
using (DBEntities context = new DBEntities())
{
//var orgTD = context.OrganisationTypeDetails.Where(otd => otd.OrganisationTypeDetailID == OrganisationTypeDetailID).FirstOrDefault();

var orgTD = (from a in context.OrganisationTypeDetails
where a.OrganisationTypeDetailID == OrganisationTypeDetailID
select a).FirstOrDefault();

orgTD.OrganisationTypeDetailID = OrganisationTypeDetailID;
orgTD.OrganisationTypeID = OrganisationTypeID;
orgTD.Title = Title;
orgTD.FirstName = FirstName;
orgTD.Surname = Surname;
orgTD.Position = Position;
orgTD.DateOfBirth = DateOfBirth;
orgTD.Address = Address;
orgTD.Country = Country;
orgTD.Postcode = Postcode;
orgTD.PhoneNumber = PhoneNumber;
orgTD.MobileNumber = MobileNumber;
orgTD.FaxNumber = FaxNumber;
orgTD.Email = Email;
orgTD.NINumber = NINumber;

context.OrganisationTypeDetails.ApplyCurrentValues(orgTD);
context.SaveChanges();

MessageBox.Show("Updated Organisation Type Details");
}

当执行这个应用程序时,它会产生一个空引用异常

在我的属性中,为了确保它不会崩溃,我必须以编程方式设置 ID;public int _OrganisationTypeDetailID=17;但我希望能够根据自己的选择选择一行,而不是只能选择从 17 开始的行。

我试过同时使用 Linq 和 Lamba 表达式,但似乎都不起作用。

如果阅读本文有很多收获,我很抱歉,如果需要,我们很乐意添加更多代码或解释 :)。

最佳答案

FirstOrDefault如果查询未返回任何结果,则返回类型的默认值,因此在 FirstOrDefault 之后检查结果是否为 null。

应该是这样的

 var orgTD = (from a in context.OrganisationTypeDetails
where a.OrganisationTypeDetailID == OrganisationTypeDetailID
select a).FirstOrDefault();

if(orgTD == null)
return;

如果您确定该查询至少返回一个元素,请使用 First相反

关于c# - 无法从数据网格 "Object reference not set to an instance of an object."更新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13602041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com