在ASP.NET 2.0中操作数据之二十三:基于用户对修改(4)

[System.ComponentModel.DataObjectMethodAttribute( System.ComponentModel.DataObjectMethodType.Update, false)] public bool UpdateProduct(string productName, string quantityPerUnit, int productID) { Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID); if (products.Count == 0) // no matching record found, return false return false; Northwind.ProductsRow product = products[0]; product.ProductName = productName; if (quantityPerUnit == null) product.SetQuantityPerUnitNull(); else product.QuantityPerUnit = quantityPerUnit; // Update the product record int rowsAffected = Adapter.Update(product); // Return true if precisely one row was updated, otherwise false return rowsAffected == 1; }

  通过这个重载方法,我们可以开始添加GridView控件以及相关的ObjectDataSource控件。添加一个GridView控件到页面上,并且设置它的ID属性为ProductBySupplier,然后配置它使用新的名为ProductBySupplierDataSource的ObjectDataSource控件。因为我们想通过选择供应商来使GridView显示那些产品,我们需要使用ProductBLL类的GetProductsBySupplierID(supplierID)方法。同时需要把刚刚添加的重载方法UpdateProduct映射到ObjectDataSource的Update()方法。

/uploads/allimg/200612/1K63X219_0.png

图11:配置ObjectDataSource使用添加的UpdateProduct重载方法

  接下来提示要我们为GetProductsBySupplierID(supplierID)方法的supplierID输入参数选择参数源。因为我们想要在DetailsView中显示供应商的产品信息,我们使用SuppliersDetails这个DetailsView控件的SelectedValue属性作为参数源。

/uploads/allimg/200612/1K639A58_0.png

图12:使用SuppliersDetails DetailsView控件的SelectedValue属性作为参数源

  回到GridView中,除去ProductName,QuantityPerUnit,还有Discontinued以外的其他成员,并标记Discontinued CheckBoxField为read-only。而且,在GridView的智能标签中勾上Enable Editing这个选项。做完这些改变之后,GridView和ObjectDataSource声明标记应该和下面的相似:

<asp:GridView runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="ProductsBySupplierDataSource"> <Columns> <asp:CommandField ShowEditButton="True" /> <asp:BoundField DataField="ProductName" HeaderText="Product" SortExpression="ProductName" /> <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qty/Unit" SortExpression="QuantityPerUnit" /> <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" ReadOnly="True" SortExpression="Discontinued" /> </Columns> </asp:GridView> <asp:ObjectDataSource runat="server" OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL" SelectMethod="GetProductsBySupplierID" UpdateMethod="UpdateProduct"> <UpdateParameters> <asp:Parameter Type="String" /> <asp:Parameter Type="String" /> <asp:Parameter Type="Int32" /> </UpdateParameters> <SelectParameters> <asp:ControlParameter ControlID="SupplierDetails" PropertyName="SelectedValue" Type="Int32" /> </SelectParameters> </asp:ObjectDataSource>

  和前面一个ObjectDataSource一样,这个ObjectDataSource控件的OldValuesParameterFormatString设置成了original_{0},会在更新产品名称及其单价时候出现问题。可以从声明中除去这个属性或者把它的值设置为默认的{0}。在配置完成之后,我们的页面现在可以在GridView中显示被选择的供应商的产品信息(见图13)。现在任何一个产品的名字以及单价都是可以编辑更新的。然后,我们需要更新代码逻辑,以确保为指定供应商相关的用户过滤那些已经废弃的产品。我们将在第四步的最后实现它。

/uploads/allimg/200612/1K643KE_0.png

图13:选择的供应商的产品被显示

  注意:通过添加可编辑的GridView控件,在Suppliers下拉框的SelectedIndexChanged事件处理器中,我们应该更新GridView回到只读状态。否则,如果在编辑一个产品信息的同时,更换一个供应商,一个相应的GridView的索引将会保持GridView的可编辑状态。为了避免发生这类事情,可以在SelectedIndexChanged事情中很简单地设置GridView的EditIndex属性为-1。

第五步:当“显示/编辑所有供应商”没有被选择时候,不允许编辑已经废弃的产品

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwwsy.html