带有实体框架的动态数据:批量编辑行

本文关键字:编辑 数据 动态 实体 框架 | 更新日期: 2023-09-27 18:13:36

我有一个产品管理网站,已使用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"装饰。所以不能有任何实体特定的持久化。

我已经开始修改列表。

带有实体框架的动态数据:批量编辑行

我们解决了。

我将首先解释使用实体框架代码实现动态数据的通用批量编辑的不同部分。解决方案并不漂亮。

创建一个属性(我们将其命名为EditableInBulk),你可以用它来装饰实体框架POCO类中的属性。

在列表中。在你的gridview中添加一个带有CheckBox控件的列,这样你就可以很容易地选择哪些行应该受到批量更新的影响。

在GridView的ItemDataBound上,在HeaderRow中,在适当的列中添加正确类型的DynamicControl。只有当metaccolumn被EditableInBulk修饰时,才添加DynamicControl

创建一个按钮或以某种方式触发批量更新。首先,从HeaderRow中创建的DynamicControl's中获取新值。

然后遍历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);

在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();

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