使用实体框架的动态数据:批量编辑行
我有一个使用ASP.NET动态数据和实体框架4.1(代码优先)生成的产品管理网站。使用实体框架的动态数据:批量编辑行
我已经开始创建批量编辑行的方式。我有我想要批量编辑的列的编辑控件(我创建了一个名为EditableInBulk的新属性,用于装饰我的属性)。我还在GridView中添加了一个新的列,并带有一个复选框,指示是否应该批量编辑该行。
现在剩下的事情是我需要以编程方式更新我已用“编辑”检查过的行。
下面是我用来查找已检查的行的代码,缺少的是实际更新数据并保留。
// Find all items that will be edited
foreach (GridViewRow row in GridView1.Rows)
{
if (row.RowType != DataControlRowType.DataRow)
continue;
// Fetch the item index of the rows that has "Edit" checked
var editMe = row.Cells[1].Controls.OfType<CheckBox>().Any(ch => ch.Checked);
if (editMe)
{
// Edit the fields in the row and persist
}
}
我应该可以在GridView控件中使用UpdateRow方法。但在此之前,我需要更新行内的字段。
有没有人有我如何能实现这一目标的线索?
事情也是,它需要是通用的。应该使用具有我用自定义属性“EditableInBulk”装饰的列的每个实体类型。所以不能有任何特定的实体持续进行。
我已经开始修改动态数据项目附带的List.aspx文件。
好的,我们解决了它。
我将解释不同的部分,以实体框架代码优先实现动态数据的通用批量编辑。解决方案并不美观。但它的工作。
创建一个属性(我们将其命名为EditableInBulk),它用您的装饰实体框架POCO类中的属性。
在List.aspx(由动态数据自动生成)中添加一个带有CheckBox控件的列到您的GridView,这样您可以轻松地选择哪些行应该受批量更新的影响。
在GridView上的ItemDataBound上,在HeaderRow中,在适当的列中添加正确类型的DynamicControl。如果所讨论的MetaColumn是用EditableInBulk装饰的,只需添加DynamicControl。
创建一个按钮或以某种方式触发批量更新。首先从已经在HeaderRow中创建的DynamicControl中获取新的值。
然后遍历GridView的行(使用RowType == DataRow)。确保当前行被选为“待编辑”(找到新列中的复选框控件并检查值)。
获取当前行的实体ID。但首先,您必须根据页面和页面大小计算行号。否则,如果你在第一页以外的页面上,它将不起作用。
int index = row.DataItemIndex;
if (GridView1.PageIndex > 0)
{
index = row.DataItemIndex - (GridView1.PageIndex)*GridView1.PageSize;
}
var entityId = Convert.ToInt32(GridView1.DataKeys[index].Value.ToString());
从您的DataContext实例化ObjectContext。
var objectContext = ((IObjectContextAdapter) new YourProject.Data.DataContext()).ObjectContext;
获取当前列表/数据集的实体类型名称。
string entityTypeName = GridView1.DataKeyNames[0].Substring(0, GridView1.DataKeyNames[0].Count() - 2);
借助实体ID和实体类型实例化一个EntityKey类型的新对象。 获取将与ObjectContext的
var entityKey = new EntityKey(objectContext.DefaultContainerName + "." + entityTypeName + "s", GridView1.DataKeyNames[0], entityId);
注意的帮助下+“S”的解决方案将编辑的对象...工程:)(快乐/悲伤)。
var entity = objectContext.GetObjectByKey(entityKey);
在Reflection的帮助下,设置新的属性值。
PropertyInfo prop = entity.GetType().BaseType.GetProperty(newValue.Key, BindingFlags.Public | BindingFlags.Instance);
var typedValue = TypeDescriptor.GetConverter(prop.PropertyType).ConvertFrom(newValue.Value);
if (null != prop && prop.CanWrite)
{
prop.SetValue(entity, typedValue, null); }
保存新更新的实体!
objectContext.SaveChanges();
我假设有几个其他更好的方法来实现批量更新,但这是有效的。如果有需求,我会从解决方案中添加更多代码。我只是想让你们知道有一种方法。