Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ListItems attributes in a DropDownList are lost on postback?

A coworker showed me this:

He has a DropDownList and a button on a web page. Here's the code behind:

protected void Page_Load(object sender, EventArgs e)     {         if (!IsPostBack)         {             ListItem item = new ListItem("1");             item.Attributes.Add("title", "A");              ListItem item2 = new ListItem("2");             item2.Attributes.Add("title", "B");              DropDownList1.Items.AddRange(new[] {item, item2});             string s = DropDownList1.Items[0].Attributes["title"];         }     }      protected void Button1_Click(object sender, EventArgs e)     {         DropDownList1.Visible = !DropDownList1.Visible;     } 

On the page load, the items' tooltips are showing, but on the first postback, the attributes are lost. Why is this the case, and are there any workarounds?

like image 361
David Hodgson Avatar asked Aug 21 '09 18:08

David Hodgson


1 Answers

I had the same problem and wanted to contribute this resource where the author created an inherited ListItem Consumer to persist attributes to ViewState. Hopefully it will save someone the time I wasted until I stumbled on it.

protected override object SaveViewState() {     // create object array for Item count + 1     object[] allStates = new object[this.Items.Count + 1];      // the +1 is to hold the base info     object baseState = base.SaveViewState();     allStates[0] = baseState;      Int32 i = 1;     // now loop through and save each Style attribute for the List     foreach (ListItem li in this.Items)     {         Int32 j = 0;         string[][] attributes = new string[li.Attributes.Count][];         foreach (string attribute in li.Attributes.Keys)         {             attributes[j++] = new string[] {attribute, li.Attributes[attribute]};         }         allStates[i++] = attributes;     }     return allStates; }  protected override void LoadViewState(object savedState) {     if (savedState != null)     {         object[] myState = (object[])savedState;          // restore base first         if (myState[0] != null)             base.LoadViewState(myState[0]);          Int32 i = 1;         foreach (ListItem li in this.Items)         {             // loop through and restore each style attribute             foreach (string[] attribute in (string[][])myState[i++])             {                 li.Attributes[attribute[0]] = attribute[1];             }         }     } } 
like image 88
Laramie Avatar answered Sep 25 '22 18:09

Laramie