asp.net 跬步篇(5) repeater 自訂模板實現特殊樣式控制項

來源:互聯網
上載者:User

 

最近在對一個項目的功能進行維護的時候,碰到了一個很特別的問題。項目實現的功能動態調查表。也就是根據動態產生調查問卷。問卷在不同的類型下有不同的問題內容。前期已經完成了功能的開發。但是現在的調查問卷出現了一個特別的題目樣式,已經不是單純的單選、或者多選、文本。而是一個具備多個控制項特點的複合控制項,而且要在後台可以進行動態添加。如果按照使用者控制項思路編寫的話,感覺實現上比較複雜、頁面綁定也比較麻煩。所以就想乾脆寫一個新的具備要求特點的控制項,然後在有這個類型的控制項時,直接後台添加。給這個控制項增加必要的屬性〔綁定、取值〕。在編寫之前就是確定編寫的基礎,是從頭開始寫?還是在已有的控制項基礎上進行擴充。控制項樣式如下:

  

據功能要求概括控制項具備一下功能:具備動態綁定功能、項目由一個複選框和文字框組成。

 

 

 

最終決定用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上有協助。最後:程式只有想不到的,沒有做不到的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.