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