带编辑窗体(模板)的 GridView






4.33/5 (3投票s)
方便地编辑 GridView 行。
引言
当我开始新的工作时,我发现那里的开发人员仍然在使用 .NET 1.1 的思维模式,因此他们使用旧方法或直接在 Render
方法中编辑 HTML。用这种糟糕的方式制作的控件之一是使用编辑表单而不是经典的编辑行 GridView,我希望将其改为新的(并且我希望也是正确的)方式。
背景
让我们开始设计
- 获取编辑表单的
ITemplate
(可绑定) - 将模板插入到行中,而不是默认的包含输入框的单元格
- 在回发时提取值,并使用它们来更新数据源
关注点
该控件本身并不复杂,所以我不会描述所有的代码,我只会提到有趣的部分。
- 我需要一个可绑定的模板,它可以提取输入的值,所以我使用了
IBindableTemplate
并将其用作属性。 - 而且,第二件事是提取值
[PersistenceMode(PersistenceMode.InnerProperty),
TemplateContainer(typeof(GridViewRow),
System.ComponentModel.BindingDirection.TwoWay)]
public IBindableTemplate EditItemTemplate
{
set { _EditItemTemplate = value; }
get { return _EditItemTemplate; }
}
这个片段中有趣的是属性。普通的 ITemplate
只提供一种方式,所以我们无法提取插入的值,这就是为什么我使用 IBindableTemplate
并在属性中声明双向绑定方向的原因。
protected override void ExtractRowValues(
System.Collections.Specialized.IOrderedDictionary fieldValues,
GridViewRow row, bool includeReadOnlyFields, bool includePrimaryKey)
{
if (_EnableTemplateEditing)
{
// Not working
// fieldValues = _EditItemTemplate.ExtractValues(row.Cells[0]);
// Working
IOrderedDictionary dict = _EditItemTemplate.ExtractValues(row.Cells[0]);
foreach (string s in dict.Keys)
fieldValues.Add(s, dict[s]);
}
else
base.ExtractRowValues(fieldValues, row, includeReadOnlyFields,
includePrimaryKey);
}
奇怪的是,即使 fieldValues
对象为空,你也不能将从模板获得的 IOrderedDictionary
分配给 fieldValues
对象。你必须像所示那样逐个添加值。
要启用模板编辑,请不要忘记将 EnableTemplateEditing
属性设置为 true
。
历史
- 2008年2月9日 - 首次版本。
- 2008年2月12日 - 添加下载。