最近在对一个项目的功能进行维护的时候,碰到了一个很特别的问题。项目实现的功能动态调查表。也就是根据动态生成调查问卷。问卷在不同的类型下有不同的问题内容。前期已经完成了功能的开发。但是现在的调查问卷出现了一个特别的题目样式,已经不是单纯的单选、或者多选、文本。而是一个具备多个控件特点的复合控件,而且要在后台可以进行动态添加。如果按照用户控件思路编写的话,感觉实现上比较复杂、页面绑定也比较麻烦。所以就想干脆写一个新的具备要求特点的控件,然后在有这个类型的控件时,直接后台添加。给这个控件增加必要的属性〔绑定、取值〕。在编写之前就是确定编写的基础,是从头开始写?还是在已有的控件基础上进行扩展。控件样式如下:
据功能要求概括控件具备一下功能:具备动态绑定功能、项目由一个复选框和文本框组成。
最终决定用repeater 来扩展。repeater本身的绑定应该是很高效的,干净。然后就是选项的问题。
直接定义一个新的repeater模板来生成。动态绑定repeater 就出现了上述效果。
模版定义代码见下:
代码
public class RepeaterTemplate : ITemplate
{
private string _dataValueField;
private string _dataTextField;
private string _textboxField;
public string TextboxField
{
get { return _textboxField; }
set { _textboxField = value; }
}
public RepeaterTemplate(Repeater rpt, string dataValueField, string dataTextField)
{
_dataValueField = dataValueField;
_dataTextField = dataTextField;
rpt.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound);
}
public RepeaterTemplate(Repeater rpt, string dataValueField, string dataTextField,string textboxField)
{
_dataValueField = dataValueField;
_dataTextField = dataTextField;
_textboxField = textboxField;
rpt.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound);
}
public void InstantiateIn(Control container)
{
CheckBox chk = new CheckBox();
chk.ID = "CTCheck";
TextBox tbx = new TextBox();
tbx.ID = "CTText";
HiddenField value = new HiddenField();
value.ID = "hdfValue";
HtmlGenericControl tr = new HtmlGenericControl("tr");
HtmlGenericControl td1 = new HtmlGenericControl("td");
HtmlGenericControl td2 = new HtmlGenericControl("td");
td1.Controls.Add(chk);
td1.Controls.Add(value);
td2.Controls.Add(tbx);
tr.Controls.Add(td1);
tr.Controls.Add(td2);
container.Controls.Add(tr);
}
void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
CheckBox chk = (CheckBox)e.Item.FindControl("CTCheck");
HiddenField value = (HiddenField)e.Item.FindControl("hdfValue");
TextBox tbx= (TextBox)e.Item.FindControl("CTText");
if (chk != null)
{
if (!string.IsNullOrEmpty(_textboxField))
{
tbx.Text = drv[_textboxField].ToString();
if (drv[_textboxField].ToString().Length > 1)
chk.Checked = true;// "Checked";//chk.Checked = true;
}
chk.Text = drv[_dataTextField].ToString();
value.Value = drv[_dataValueField].ToString();
}
}
}
在封装的控件内部绑定repeater 就可以了。
代码
Repeater rpt = new Repeater();
rpt.ID = "rpt";
rpt.HeaderTemplate = new HeaderTemplate();
rpt.FooterTemplate = new FooterTemplate();
rpt.ItemTemplate = new RepeaterTemplate(rpt, 字段,字段, 字段);
rpt.DataSource = temp;
rpt.DataBind();
互相学习,也希望可以对一些初学的同学在认识使用repeater上有帮助。最后:程序只有想不到的,没有做不到的。