我有一个使用 ASP.NET 动态数据和 Entity Framework 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文件。
最佳答案
好的,我们解决了。
我将解释使用 Entity Framework Code First 实现动态数据通用批量编辑的不同部分。解决方案并不漂亮。但它有效。
创建一个属性(我们将其命名为 EditableInBulk),您可以使用该属性装饰 Entity Framework POCO 类中的属性。
在 List.aspx(由动态数据自动生成)中,将带有 CheckBox 控件的列添加到您的 gridview,这样您就可以轻松地选择哪些行应该受到批量更新的影响。
在 GridView 上的 ItemDataBound 上,在 HeaderRow 中的适当列中添加正确类型的 DynamicControl。仅当相关 MetaColumn 装饰有 EditableInBulk 时才添加 DynamicControl。
创建一个按钮或以某种方式触发批量更新。首先从在 HeaderRow 中创建的 DynamicControl 获取新值。
然后遍历 GridView 的行(使用 RowType == DataRow)。确保当前行已被选择为“待编辑”(在新列中找到 CheckBox 控件并检查值)。
获取当前行的实体 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);
在反射的帮助下,设置新的属性值。
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();
我认为还有其他几种更好的方法可以实现批量更新,但这行得通。如果有需求,我将从我们的解决方案中添加更多代码。我只是想让你们知道有办法。
关于c# - Entity Framework 的动态数据 : Bulk editing rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7995249/