2011-11-03 50 views
3

我有一个使用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文件。

回答

4

好的,我们解决了它。

我将解释不同的部分,以实体框架代码优先实现动态数据的通用批量编辑。解决方案并不美观。但它的工作。

创建一个属性(我们将其命名为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(); 

我假设有几个其他更好的方法来实现批量更新,但这是有效的。如果有需求,我会从解决方案中添加更多代码。我只是想让你们知道有一种方法。