惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
C
Check Point Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
F
Full Disclosure
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
博客园 - 司徒正美
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
云风的 BLOG
云风的 BLOG
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
雷峰网
雷峰网
V
V2EX - 技术
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Spread Privacy
Spread Privacy
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security Affairs
SecWiki News
SecWiki News
Schneier on Security
Schneier on Security
O
OpenAI News
Jina AI
Jina AI
PCI Perspectives
PCI Perspectives
Cyberwarzone
Cyberwarzone
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog RSS Feed
I
InfoQ
D
Docker
P
Palo Alto Networks Blog
Recorded Future
Recorded Future
M
MIT News - Artificial intelligence
博客园 - Franky
B
Blog
Scott Helme
Scott Helme
博客园 - 叶小钗
D
DataBreaches.Net

博客园 - 邢少

IM客户端Socks 5代理协议应用 招聘程序员的方法 CAS 与.net 集成的 “循环重定向”问题分析 .net 开发 跬步篇(6〕—绝对路径转换相对路径的 麻雀虽小,五脏俱全-C# 创建windows服务、socket通讯实例 asp.net 跬步篇(4) EnableSessionState设置 引起的框架集加载问题 控制CPU曲线引发的感想 asp.net 开发 跬步篇〔3〕.net 邮件批量发送 驱驾ViewState利剑—压缩ViewState 如何驾驭ViewState利剑 编程“方便面”之用户控件 天气数据一把抓。 .NET程序员应该知道些什么[转载] asp.net 开发 跬步篇(2) JQuery +ashx 升级之 JSon asp.net 开发 跬步篇〔1〕_ajax web页面复杂处理延时、客户交互问题 Asp .net +jquery +.ashx 文件实现分页 Gridview repeater datelist 区别 [技术思考]一段时间后的回首。 粮食的存在
asp.net 跬步篇(5) repeater 自定义模板实现特殊样式控件
邢少 · 2010-08-06 · via 博客园 - 邢少

2010-08-06 11:21  邢少  阅读(2974)  评论()    收藏  举报

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

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

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

作者:邢少

关于作者:从业至今一直从事软件前沿的分析设计工作,对软件开发过程、项目管理有浓厚的兴趣。如有想法、建议,请多多赐教

本文版权归作者和博客园共有,欢迎转载,但未经作者同意请保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过 xingshaoxian@163.com 与我联系,非常感谢。