Asp.net自定義控件之單選/多選控件
來源:易賢網(wǎng) 閱讀:719 次 日期:2016-08-06 13:49:51
溫馨提示:易賢網(wǎng)小編為您整理了“Asp.net自定義控件之單選/多選控件”,方便廣大網(wǎng)友查閱!

本文實例為大家分享了Asp.net單選、復(fù)選框控件的具體實現(xiàn)代碼,供大家參考,具體內(nèi)容如下

將常用的jquery插件封裝成控件也是個不錯的選擇。

先看看效果:

名單

1.新建類庫項目,創(chuàng)建數(shù)據(jù)源類

[Serializable]

public class Select2Item

{

public bool Selected { get; set; }

public string Text { get; set; }

public string Value { get; set; }

public Select2Item() { }

public Select2Item(string text, string value)

{

 this.Text = text;

 this.Value = value;

}

public Select2Item(string text, string value, bool selected)

{

 this.Text = text;

 this.Value = value;

 this.Selected = selected;

}

2.創(chuàng)建控件類CheckList,繼承與WebControl,并定義 public List<Select2Item> Items數(shù)據(jù)項屬性。

3.引入腳本文件及樣式文件 

a.創(chuàng)建腳本或樣式文件,設(shè)置文件的屬性-生成操作-嵌入的資源

名單

b.需要在namespace上添加標記 [assembly: WebResource("命名空間.文件夾名.文件名", "mime類型")]

如:

[assembly: WebResource("Control.Style.checklist.css", "text/css",PerformSubstitution = true)]

[assembly: WebResource("Control.Scripts.checklist.js", "application/x-javascript")] 

如果css文件里面存在圖片的話,同樣將圖片設(shè)置為嵌入的資源,在css中的寫法為<%=WebResource("命名空間.文件夾名.文件名")%> 

PerformSubstitution 表示嵌入式資源的處理過程中是否分析其他Web 資源 URL,并用到該資源的完整路徑替換。

c.重寫protected override void OnPreRender(EventArgs e),引入嵌入的腳本或樣式文件

if(Page!=null) Page.Header.Controls.Add(LiteralControl),將<script><link>標簽放到LiteralControl中,然后將LiteralControl添加到Page.Header中,最后在頁面里你就會看到引入的<script><link>標簽。

protected override void OnPreRender(EventArgs e)

{

 if (this.Page != null)

 {

 StringBuilder sbb = new StringBuilder();

 sbb.Append(string.Format(STYLE_TEMPLATE, Page.ClientScript.GetWebResourceUrl(this.GetType(), "HandControl.Style.checklist.css")));

 sbb.Append(string.Format(SCRIPT_TEMPLATE, Page.ClientScript.GetWebResourceUrl(this.GetType(), "HandControl.Scripts.checklist.js")));

 bool hascss = false;

 LiteralControl lcc = new LiteralControl(sbb.ToString());

 lcc.ID = "lccheck";

 foreach (Control item in Page.Header.Controls)

 {

  if (item.ID == "lccheck")

  hascss = true;

 }

 if (!hascss)

  Page.Header.Controls.Add(lcc);

 }

 base.OnPreRender(e);

4.重寫控件的protected override void Render(HtmlTextWriter writer)方法

這里主要是渲染控件的html,根據(jù)你的控件而定。 

protected override void Render(HtmlTextWriter writer)

{

 if (Items.Count > 0)

 {

 writer.Write("<div id='div" + this.ClientID + "' class='c01-tag-div' mul='" + (Multiple == true ? "1" : "0") + "'>");

 if (Multiple == false)

  writer.Write("<input name='tb" + this.ClientID + "' type='hidden' value='" + Items[0].Value + "' />");

 else

  writer.Write("<input name='tb" + this.ClientID + "' type='hidden' />");

 bool first = true;

 foreach (var item in Items)

 {

  if (Multiple == false)

  {

  if (item.Selected && first)

  {

   writer.Write("<a title='" + item.Text + "' class='c01-tag-item c01-tag-select' val='" + item.Value + "' tag='Y'>" + item.Text + "</a>");

   first = false;

  }

  else

  {

   writer.Write("<a title='" + item.Text + "' class='c01-tag-item' val='" + item.Value + "' tag='N'>" + item.Text + "</a>");

  }

  }

  else

  {

  if (item.Selected)

   writer.Write("<a title='" + item.Text + "' class='c01-tag-item c01-tag-select' val='" + item.Value + "' tag='Y'>" + item.Text + "</a>");

  else

   writer.Write("<a title='" + item.Text + "' class='c01-tag-item' val='" + item.Value + "' tag='N'>" + item.Text + "</a>");

  }

 }

 writer.Write("</div>");

 }

5.添加GetSelected方法,返回List<Select2Item>,添加GetSelectValue,返回String(多選以,號隔開)       

public List<Select2Item> GetSelected()

{

 if (Page != null)

 {

 var values = Page.Request.Form["tb" + this.ClientID].Split(',');

 var res = Items.Where(t => values.Contains(t.Value)).ToList();

 foreach (var item in Items)

 {

  if (res.Contains(item))

  {

  item.Selected = true;

  }

  else

  {

  item.Selected = false;

  }

 }

 return res;

 }

 else

 {

 return null;

 }

-------------------------------------------

public string GetSelectValue()

{

 if (Page != null)

 {

 return Page.Request.Form["tb" + this.ClientID];

 }

 return "";

6.保存狀態(tài)

你需要重寫兩個方法protected override object SaveViewState() 、protected override void LoadViewState(object savedState),旨在將Items數(shù)據(jù)項屬性保存到ViewState 

protected override object SaveViewState()

{

 var valuestr = Page.Request.Form["tb" + this.ClientID];

 if (!string.IsNullOrEmpty(valuestr))

 {

 var values = valuestr.Split(',');

 var temp = Items.Where(t => values.Contains(t.Value)).ToList();

 foreach (var item in temp)

 {

  item.Selected = true;

 }

 }

 return new object[] { base.SaveViewState(), Items };

}

protected override void LoadViewState(object savedState)

{

 object[] vState = (object[])savedState;

 if (vState[0] != null)

 base.LoadViewState(vState[0]);

 if (vState[1] != null)

 Items = (List<Select2Item>)vState[1];

7.單選和復(fù)選的設(shè)置,在js中控制

 添加屬性 

[Description("獲取和設(shè)置多選"), DefaultValue(true), Browsable(true), Category("雜項")]

public bool Multiple { get; set; }

 在OnPreRender代碼中你會發(fā)現(xiàn)Multiple屬性會影響div的mul屬性值,從而判斷是否多選(默認多選)

 8.其它說明

private static readonly string STYLE_TEMPLATE = "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />\r\n";

 private static readonly string SCRIPT_TEMPLATE = "<script type=\"text/javascript\" src=\"{0}\"></script>\r\n";

效果圖:

名單

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機網(wǎng)站地址:Asp.net自定義控件之單選/多選控件
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65317125(9:00—18:00) 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)