4

我有一个gridview,我在页脚行中创建了一个插入模板。

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

我有一个永远不会被解雇的 OnInserting 事件处理程序。

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

我没有看到将字典作为参数插入的方法。我已经看到提到抓取 ObjectDataSourceView 并使用它的 Insert 方法,但我没有看到任何关于如何做到这一点的提及,而且 MSDN 声称您无权访问。

反思是要走的路吗?有没有更好的方法在 gridview 上插入行?我在这里的步骤中是否遗漏了一些明显的东西?

下面是代码:
ObjectDataSource:

    <asp:ObjectDataSource ID="LeasesDS" runat="server" OnInserting="LeasesDS_Inserting" 
    DataObjectTypeName="CLS.BusObjects.LeaseObj" DeleteMethod="Delete" 
    InsertMethod="Insert" OldValuesParameterFormatString="original_{0}" 
    SelectMethod="GetLeasesByCustomerID" TypeName="CLS.BusObjects.LeaseObj" 
    UpdateMethod="Update">
    <SelectParameters>
        <asp:Parameter Name="customerID" Type="Int32" />
    </SelectParameters>
    <InsertParameters>
        <asp:Parameter Name="CustomerID" Type="Int32" />
        <asp:Parameter Name="PurchaseDate" Type="DateTime" />
        <asp:Parameter Name="AutoYear" Type="Int32" />
        <asp:Parameter Name="Make" Type="String" />
        <asp:Parameter Name="Model" Type="String" />
        <asp:Parameter Name="LeaseEndDate" Type="DateTime" />
    </InsertParameters>
</asp:ObjectDataSource>


代码隐藏方法:

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;
    }
4

1 回答 1

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 字典中看到它。

于 2008-12-31T07:38:27.173 回答