[Mono-list] ASP.NET CheckBoxList Control
John Anderson
sontek at gmail.com
Tue Apr 17 17:50:27 EDT 2007
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
}
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-list/attachments/20070417/f4feefe5/attachment-0001.html
More information about the Mono-list
mailing list