下面就是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));
DataGrid1.Columns.Add(DynamicColumns("pub_name",true));
DataGrid1.Columns.Add(DynamicColumns("city",true));
DataGrid1.Columns.Add(DynamicColumns("state",true));
DataGrid1.Columns.Add(DynamicColumns("country",true));
DataGrid1.DataKeyField = "pub_id";
DataGrid1.DataSource = GetDataTable(sql);
DataGrid1.DataBind();
}
DynamicColumns有两个参数: column(字符类型)和isEditable(布尔类型). column变量当然就是我们要加入TemplateColumn的列名. isEditable变量是用作测试的, 如果我们希望这个列是允许编辑的话.
protected TemplateColumn DynamicColumns(string column, bool isEditable)
{
TemplateColumn genericcolumn = new TemplateColumn();
genericcolumn.HeaderText = column;
genericcolumn.ItemTemplate = new GenericItem(column);
if(isEditable)
{
genericcolumn.EditItemTemplate = new ValidateEditItem(column);
}
return genericcolumn;
}
正如你所看到的, 首先我们实例化一个TemplateColumn(genericcolumn), 根据我们要添加的列的名字设置HeaderText属性(当然,你可以设置为任何东西都可以). 接着, 我们通过添加新的GenericItem的参考(reference), 把ItemTemplate添加到genericcolumn, 并把名称传入. 最后, 我们必须检查isEditable, 以便看看我们需不需要允许编辑这个列. 如果为真, 我们要往ValidateEditItem添加新的参考, 而且把列名也传过去.








