ITempalte动态的实现 :TripleASP实现DataGrid 动态添加模板列的实现代码

来源:不详 责任编辑:栏目编辑 发表时间:2013-07-01 21:21 点击:
使用模版的另一个优势,就是它们能动态的添加到你的控件里面去. 这样的话, 你可以事先设计好模版, 然后通过简单的几行代码就添加到你的控件中.
下面这篇文章就要告诉你如何如何一步步的添加一个动态的ItemTemplate和EditItemTemplate到DataGrid中. 另外, 还会告诉你怎么获取和更新用户对EditItemTemplate所做的改变. 例子将会是很简单的. 然后, 我很快就会在TripleASP上面正式发布一个改进后的TableEditor版本. 这个版本将更好的说明如何使用动态模版.

ITempalte的实现
为了能动态的添加ItemTemplate和EditItemTemplate, 我们需要创建2个类来实现ITemplate的接口(Interface). 第一个类是GenericItem. 这个类的主要工作就是: 取数据源的列名, 创建一个文本控件(literal contral), 为这个文本控件赋值, 最后把这个文本控件加到父控件(在这里父控件就是DataGrid了).
到目前为止还是很顺利. 在继续下面的讨论之前, 我们来看看代码和完成的步骤.
using System;
using System.Web;
using System.Data; using System.Web.UI;
using System.Web.UI.WebControls;
namespace TripleASP.ItemTemplates
{
/// <summary>
/// Summary description for GenericItem.
/// </summary>
public class GenericItem : ITemplate
{
private string column;
//private bool validate;
public GenericItem(string column)
{
this.column = column;
}
public void InstantiateIn(Control container)
{
Literal l = new Literal();
l.DataBinding += new EventHandler(this.BindData);
container.Controls.Add(l);
}
public void BindData(object sender, EventArgs e)
{
Literal l = (Literal) sender;
DataGridItem container = (DataGridItem) l.NamingContainer;
l.Text = ((DataRowView) container.DataItem)[column].ToString();
}
}
}
正如你看到的, GenericItem类实现了ITemplate的接口(interface). 因为我们是实现接口, 所以必须包括InstantiateIn这个方法. 这个方法是用来定义所有子控件和模版所属的控件对象的. 在这个方法里面, 我们创建了一个新的Literal控件来保存DataGrid的单元值. 接着, 我们添加了DataBinding事件处理函数. 这个事件处理函数实际上就是在DataGrid绑定数据的时候, 把单元值放到Literal控件的Text属性中. 最后, 把这个Literal控件加入到控件的容器集合中. 很简单吧?
动态EditItemTemplate
动态EditItemTemplate类ValidateEditItem跟GenericItem很类似, 但是有3个地方不同.
第一个不同的地方是, 我们添加的是Textbox控件而不是Literal控件. 这样的话, 在编辑模式下, 用户可以做任何修改.
第二个不同的地方, 你会发现我们会显式地命名控件. 这会使我们能够获取更新事件中的任何数据变化.
最后一个不同, 你会看到一个跟Textbox相联系的RequiredFieldValidator控件. 这是可选的. 但是, 这的确让你知道有些事是可以这样做的.
下面就是ValidateEditItem的代码:
using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web;
namespace TripleASP.ItemTemplates
{
/// <summary>
/// Summary description for ValidateEditItem.
/// </summary>
public class ValidateEditItem : ITemplate
{
private string column;
public ValidateEditItem(string column)
{
this.column = column;
}
public void InstantiateIn(Control container)
{
TextBox tb = new TextBox();
tb.DataBinding += new EventHandler(this.BindData);
container.Controls.Add(tb);
tb.ID = column;
RequiredFieldValidator rfv = new RequiredFieldValidator();
rfv.Text = "Please Answer";
rfv.ControlToValidate = tb.ID;
rfv.Display = ValidatorDisplay.Dynamic;
rfv.ID = "validate" + tb.ID;
container.Controls.Add(rfv);
}
public void BindData(object sender, EventArgs e)
{
TextBox tb = (TextBox) sender;
DataGridItem container = (DataGridItem)tb.NamingContainer;
tb.Text = ((DataRowView) container.DataItem)[column].ToString();
}
}
}
动态模版的实现
现在我们已经有两个实现了ITempalte接口的类了. 一切准备好了! 我们现在要做的就是把它们加入到我们的datagrid里面.
我们把BindData和DynamicColumns两个方法放在一起. BindData主要是创建SQL查询语句, 往datagrid添加列(动态列), 然后把数据表绑定到datagrid.
void BindData()
{
string sql = "Select * from publishers Where State Is not null";
DataGrid1.Columns.Add(DynamicColumns("pub_id",false))

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • 浅析.NET下XML数据访问新机制
      • asp.net 面试+笔试题目第1/2页
      • C# 邮件地址是否合法的验证
      • asp.net 设置GridView的选中行的实现代码
      • C#高级编程:数据库连接[1]
      • 经典C++程序1
      • IIS 自动回收导致后台定时器失效的问题解决
      • ASP.NET&#160;GridView列表代码示例
      • Asp.net MVC源码分析--Action Filter的链式调用
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1