当前位置:  开发笔记 > 编程语言 > 正文

ObjectDataSource Gridview插入失败W /空值字典

如何解决《ObjectDataSourceGridview插入失败W/空值字典》经验,为你挑选了1个好方法。

我有一个gridview,我在页脚行中创建了一个Insert Template.

我有一个绑定到业务对象的ObjectDataSource.

我有一个永远不会被触发的OnInserting事件处理程序.

一旦我在ObjectDataSource上调用.Insert,程序就会遇到错误.我收到的错误是没有值,我应该检查以确保值字典不为空.

我没有看到插入字典作为参数的方法.我已经看到提到抓取ObjectDataSourceView并使用它的Insert方法,但我没有看到任何提及如何做到这一点,MSDN声称你没有访问权限.

是反思的方式去这里?有没有更好的方法在gridview上插入行?我在这里的步骤中遗漏了哪些明显的东西?

下面是代码:
ObjectDataSource:

    
    
        
    
    
        
        
        
        
        
        
    


CodeBehind方法:

protected void LeasesGrid_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Insert" && Page.IsValid)
        {
            LeasesDS.Insert();
        }
    }
    protected void LeasesDS_Inserting(object sender, ObjectDataSourceMethodEventArgs e)
    {
        DropDownList GridCustomersList = (DropDownList)LeasesGrid.FooterRow.FindControl("GridCustomersList");
        TextBox PurchaseDate = (TextBox)LeasesGrid.FooterRow.FindControl("PurchaseDate");
        TextBox AutoYear = (TextBox)LeasesGrid.FooterRow.FindControl("AutoYear");
        TextBox Make = (TextBox)LeasesGrid.FooterRow.FindControl("Make");
        TextBox Model = (TextBox)LeasesGrid.FooterRow.FindControl("Model");
        TextBox LeaseEndDate = (TextBox)LeasesGrid.FooterRow.FindControl("LeaseEndDate");
        e.InputParameters["CustomerID"] = Convert.ToInt32(GridCustomersList.SelectedValue);
        DateTime? purchaseDate = null;
        if (!string.IsNullOrEmpty(PurchaseDate.Text)) purchaseDate = Convert.ToDateTime(PurchaseDate.Text);
        e.InputParameters["PurchaseDate"] = purchaseDate;
        int? autoYear = null;
        if (!string.IsNullOrEmpty(AutoYear.Text)) autoYear = Convert.ToInt32(AutoYear.Text);
        e.InputParameters["AutoYear"] = autoYear;
        string make = null;
        if (!string.IsNullOrEmpty(Make.Text)) make = Make.Text;
        e.InputParameters["Make"] = make;
        string model = null;
        if (!string.IsNullOrEmpty(Model.Text)) model = Model.Text;
        e.InputParameters["Model"] = model;
        DateTime? leaseEndDate = null;
        if (!string.IsNullOrEmpty(LeaseEndDate.Text)) leaseEndDate = Convert.ToDateTime(LeaseEndDate.Text);
        e.InputParameters["LeaseEndDate"] = leaseEndDate;
    }

小智.. 5

您的示例不一致,因为您设置了DataObjectTypeName,但您的LeasesDS_Inserting方法正在添加参数,就好像它不是一样.

如果您不需要DataObjectTypeName,则可以删除它,然后您应该有更好的机会让它工作.

如果您需要DataObjectTypeName或者只是喜欢它(就像我一样),有一种方法可以让它工作,但它并不漂亮.

在LeasesGrid_RowCommand方法中,您可以使用这样的代码来获取视图:

IDataSource ds = (IDataSource)LeasesDS;
DataSourceView view = ds.GetView(LeasesGrid.DataMember);

获取视图后,您可以构建一个字典,其中包含需要写入数据对象的值,这些值最终将传递到Insert方法.它的代码看起来与LeasesDS_Inserting中的代码非常相似,但是您将插入自己的字典而不是e.InputParameters.

准备好字典后,可以使用以下内容在视图上调用Insert:

view.Insert(dict, delegate { return false; });

应该这样做.

您将不再需要LeasesDS_Inserting方法,因为视图的Insert方法将执行将您提供的字典转换为它将传递给Insert方法的数据对象的工作.

如果您需要对该数据对象的属性进行更多处理,您将在传入LeasesDS_Inserting的InputParameters字典中看到它.



1> 小智..:

您的示例不一致,因为您设置了DataObjectTypeName,但您的LeasesDS_Inserting方法正在添加参数,就好像它不是一样.

如果您不需要DataObjectTypeName,则可以删除它,然后您应该有更好的机会让它工作.

如果您需要DataObjectTypeName或者只是喜欢它(就像我一样),有一种方法可以让它工作,但它并不漂亮.

在LeasesGrid_RowCommand方法中,您可以使用这样的代码来获取视图:

IDataSource ds = (IDataSource)LeasesDS;
DataSourceView view = ds.GetView(LeasesGrid.DataMember);

获取视图后,您可以构建一个字典,其中包含需要写入数据对象的值,这些值最终将传递到Insert方法.它的代码看起来与LeasesDS_Inserting中的代码非常相似,但是您将插入自己的字典而不是e.InputParameters.

准备好字典后,可以使用以下内容在视图上调用Insert:

view.Insert(dict, delegate { return false; });

应该这样做.

您将不再需要LeasesDS_Inserting方法,因为视图的Insert方法将执行将您提供的字典转换为它将传递给Insert方法的数据对象的工作.

如果您需要对该数据对象的属性进行更多处理,您将在传入LeasesDS_Inserting的InputParameters字典中看到它.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有