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