65.9K
CodeProject 正在变化。 阅读更多。
Home

带编辑窗体(模板)的 GridView

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.33/5 (3投票s)

2008年2月9日

CPOL

1分钟阅读

viewsIcon

76054

downloadIcon

765

方便地编辑 GridView 行。

引言

当我开始新的工作时,我发现那里的开发人员仍然在使用 .NET 1.1 的思维模式,因此他们使用旧方法或直接在 Render 方法中编辑 HTML。用这种糟糕的方式制作的控件之一是使用编辑表单而不是经典的编辑行 GridView,我希望将其改为新的(并且我希望也是正确的)方式。

背景

让我们开始设计

  1. 获取编辑表单的 ITemplate(可绑定)
  2. 将模板插入到行中,而不是默认的包含输入框的单元格
  3. 在回发时提取值,并使用它们来更新数据源

关注点

该控件本身并不复杂,所以我不会描述所有的代码,我只会提到有趣的部分。

  1. 我需要一个可绑定的模板,它可以提取输入的值,所以我使用了 IBindableTemplate 并将其用作属性。
  2. [PersistenceMode(PersistenceMode.InnerProperty), 
        TemplateContainer(typeof(GridViewRow), 
        System.ComponentModel.BindingDirection.TwoWay)]
    public IBindableTemplate EditItemTemplate
    {
         set { _EditItemTemplate = value; }
         get { return _EditItemTemplate; }
    }

    这个片段中有趣的是属性。普通的 ITemplate 只提供一种方式,所以我们无法提取插入的值,这就是为什么我使用 IBindableTemplate 并在属性中声明双向绑定方向的原因。

  3. 而且,第二件事是提取值
  4. 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日 - 添加下载。
© . All rights reserved.