代码改变世界

asp.net 跬步篇(5) repeater 自定义模板实现特殊样式控件

2010-08-06 11:21  邢少  阅读(...)  评论(...编辑  收藏

 

最近在对一个项目的功能进行维护的时候,碰到了一个很特别的问题。项目实现的功能动态调查表。也就是根据动态生成调查问卷。问卷在不同的类型下有不同的问题内容。前期已经完成了功能的开发。但是现在的调查问卷出现了一个特别的题目样式,已经不是单纯的单选、或者多选、文本。而是一个具备多个控件特点的复合控件,而且要在后台可以进行动态添加。如果按照用户控件思路编写的话,感觉实现上比较复杂、页面绑定也比较麻烦。所以就想干脆写一个新的具备要求特点的控件,然后在有这个类型的控件时,直接后台添加。给这个控件增加必要的属性〔绑定、取值〕。在编写之前就是确定编写的基础,是从头开始写?还是在已有的控件基础上进行扩展。控件样式如下:

  

据功能要求概括控件具备一下功能:具备动态绑定功能、项目由一个复选框和文本框组成。

 

 

 

最终决定用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上有帮助。最后:程序只有想不到的,没有做不到的。