我有一个gridview,我在页脚行中创建了一个Insert Template。
我有一个绑定到业务对象的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>
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;
}
答案 0 :(得分: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字典中看到它。