Hey, I'm trying to implement my own CheckBoxList control based off of
mono's.  But for some reason my LoadPostData method doesn't get fired, can
anyone see anything wrong?

using System.Collections.Generic;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web.UI.WebControls;
using System.Web.UI;
using System;
using System.Text;
using System.IO;
namespace Orchid.Web.Controls
{
   /// <summary> A checkboxlist control that uses ajax callbacks for
sorting</summary>
   public class SortableCheckBoxList : ListControl, INamingContainer,
IPostBackDataHandler
   {
       private CheckBox checkBox;
       public SortableCheckBoxList()
       {
           checkBox = new CheckBox();
           Controls.Add(checkBox);
       }
       protected override void OnPreRender(EventArgs e)
       {
           base.OnPreRender(e);
           for (int count = 0; count < Items.Count; count++)
           {
               if (Items[count].Selected)
               {
                   checkBox.ID = String.Format("chk_item_{0}",
count.ToString());
                   Page.RegisterRequiresPostBack(checkBox);
               }
           }
       }
       protected override void OnLoad(EventArgs e)
       {
           base.OnLoad(e);
           string sortId = String.Format("{0}[]", ID);
           if (Page.Request.Form[sortId] != null && !Page.IsPostBack)
           {
               string[] sortedItems = Page.Request.Form[sortId].Split(',');
               SortedItems = new int[sortedItems.Length];
               for (int count = 0; count < sortedItems.Length; count++)
                   SortedItems[count] = int.Parse(sortedItems[count]);
           }
       }
       public int[] SortedItems
       {
           get { return (int[])Page.Session[this.ID + "SortedItems"]; }
           set { Page.Session[this.ID + "SortedItems"] = value; }
       }
       protected override void Render(HtmlTextWriter writer)
       {
           if (Items == null || Items.Count == 0)
               return;
           writer.AddAttribute(HtmlTextWriterAttribute.Id, ID);
           writer.AddAttribute(HtmlTextWriterAttribute.Class, CssClass);
           writer.RenderBeginTag(HtmlTextWriterTag.Ul);

           if (SortedItems == null)
           {
               for (int itemIndex = 0; itemIndex < Items.Count;
itemIndex++)
               {
                   RenderListItem(itemIndex, writer);
               }
           }
           else
           {
               foreach (int itemIndex in SortedItems)
               {
                   RenderListItem(itemIndex, writer);
               }
           }
           writer.RenderEndTag();
           StringBuilder sb = new StringBuilder();

           string ajaxCallBack = String.Format("function() {{ new
Ajax.Request('{0}?ajaxAction={2}{3}',{{asynchronous:true, parameters:
Sortable.serialize('{1}')}})}}",
                                                Path.GetFileName(
Page.Request.PhysicalPath), ID, new Random().Next(), GetQueryString());
           sb.AppendLine(String.Format("Sortable.create('{0}',
{{onUpdate:{1}, asynchronous:true, dropOnEmpty:true,constraint:
false,overlap:'horizonal'}});",
                                       ID, ajaxCallBack));
           Page.ClientScript.RegisterStartupScript(this.Page.GetType(),
"draggable", sb.ToString(), true);
       }
       private string GetQueryString()
       {
           int count = Page.Request.QueryString.Count;
           if (count > 0)
           {
               StringBuilder queryString = new StringBuilder();
               for (int index = 0; index < count; index++)
               {
                   queryString.AppendFormat("&{0}={1}",
Page.Request.QueryString.Keys[index], Page.Request.QueryString[index]);
               }
               return queryString.ToString();
           }
           return string.Empty;
       }
       private void RenderListItem(int index, HtmlTextWriter writer)
       {
           ListItem item = Items[index];
           writer.AddAttribute(HtmlTextWriterAttribute.Id,
String.Format("item_{0}",
index));
           writer.RenderBeginTag(HtmlTextWriterTag.Li);
           checkBox.ID = String.Format("chk_item_{0}", index.ToString());
           checkBox.Text = item.Text;
           checkBox.AutoPostBack = AutoPostBack;
           checkBox.Enabled = Enabled;
           checkBox.ValidationGroup = ValidationGroup;
           checkBox.CausesValidation = CausesValidation;
           checkBox.Checked = item.Selected;
           checkBox.RenderControl(writer);
           writer.RenderEndTag();
       }

       #region IPostBackDataHandler Members

       public bool LoadPostData(string postDataKey, NameValueCollection
postCollection)
       {
           EnsureDataBound();
           int checkboxIndex = -1;

           try
           {
               string id = postDataKey.Substring(ClientID.Length + 1);
               if (Char.IsDigit(id[0]))
                   checkboxIndex = Int32.Parse(id);
           }
           catch
           {
               return false;
           }
           if (checkboxIndex == -1)
               return false;

           string val = postCollection[postDataKey];
           bool isChecked = val == "on";
           ListItem item = Items[checkboxIndex];
           if (item.Selected != isChecked)
           {
               item.Selected = isChecked;
               return true;
           }
           return false;
       }

       public void RaisePostDataChangedEvent()
       {
           if (CausesValidation)
               Page.Validate(ValidationGroup);
           OnSelectedIndexChanged(EventArgs.Empty);

       }

       #endregion
   }
}
_______________________________________________
Mono-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to