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


     

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

      

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

    最终决定用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 与我联系,非常感谢。
  • 相关阅读:
    微服务架构
    微服务架构
    Java语言编程
    Java语言编程
    Java语言编程
    《自己动手写云盘》 – 确立需求
    树上差分
    线性基
    BM(Berlekamp-Massey)算法
    FFT/FWT
  • 原文地址:https://www.cnblogs.com/xingshao/p/1793827.html
Copyright © 2020-2023  润新知