我必须我所脚注行中创建的模板插入一个gridview。

我有这势必业务对象一个ObjectDataSource。

我有从未获取发射一个OnInserting事件处理程序。

一旦我请.Insert上的ObjectDataSource程序遇到一个错误。我收到的错误是,有没有价值,我应该检查,以确保该值字典是不是空的。

我看不到的方式与字典作为参数来插入。我见过抓住ObjectDataSourceView和使用它的方法插入提及,但我不明白的是如何做到这一点任何提及和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;
    }
有帮助吗?

解决方案

您的例子是不相符的,因为你有DataObjectTypeName集,但你LeasesDS_Inserting方法是添加参数,如果它不是。

如果您不需要DataObjectTypeName,你可以删除它,那么你应该有一个更好的机会得到这个工作。

如果您需要DataObjectTypeName或者只是喜欢它(像我一样),还有一种方法来得到这个工作,但它不是漂亮。

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

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

获取视图后,您可以构建一个包含需要得到写入最终将在得到传递给你的方法插入数据对象的值的字典。该代码将看起来非常相似,你有什么LeasesDS_Inserting,但你会被插入到自己的字典,而不是e.InputParameters的。

一旦你有你的字典准备好了,你可以在视图上调用插入像这样的东西:

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

这应该这样做。

由于视图的插入方法将做转换你给它进入数据字典的工作对象是它会在传递给你的方法插入你不会需要LeasesDS_Inserting方法了。

如果您需要做的数据对象的属性的多个处理,你会看到它在传递给LeasesDS_Inserting的InputParameters字典。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top