Hi,
I'm using two lists as a dual list. I need to enhance the lists in a few ways: allow checkboxes in the destination list, only allow ONE item to be checked in the destination list, and enhance the items in the destination list to provide obvious visual cues for users.
All the code is in a user control - the lists are completely programmatically created and jquery is used to do some of the client-side magic. I am having state issues, though.
Issue 1 - move an item from the select list to the destination list. Check the item then move it back to the select list, using the To Top button. Note the item's style (now in the select list) has taken on the Red style of the inserted span from the destination list. It should be back to just a regular list item with the select list's default style.
Issue 2 - now move the same item back to the Destination list. Note that it somehow retains its checked status and the additional span I added. It should be back to just a default unchecked item (which then gets styled blue). With multiple items in the bottom list, in this manner it's possible to end up with 2 items checked in the destination list.
Issue 3 - now uncheck the item then move it back to the select list, using the To Top button. Back to the Red style???
All these issues are related - the list is trying to preserve item state. I need it to forget the item state and just let the items fall back to their default state so they can be predictably manipulated.
There is also a block of code commented out in the .js file in which I explicitly remove all the changes I make to the items. This code doesn't work either, as spans get moved around when the listbox is trying to preserve their state.
Thanks in advance for your input.
JD
C#:
Javascript:
I'm using two lists as a dual list. I need to enhance the lists in a few ways: allow checkboxes in the destination list, only allow ONE item to be checked in the destination list, and enhance the items in the destination list to provide obvious visual cues for users.
All the code is in a user control - the lists are completely programmatically created and jquery is used to do some of the client-side magic. I am having state issues, though.
Issue 1 - move an item from the select list to the destination list. Check the item then move it back to the select list, using the To Top button. Note the item's style (now in the select list) has taken on the Red style of the inserted span from the destination list. It should be back to just a regular list item with the select list's default style.
Issue 2 - now move the same item back to the Destination list. Note that it somehow retains its checked status and the additional span I added. It should be back to just a default unchecked item (which then gets styled blue). With multiple items in the bottom list, in this manner it's possible to end up with 2 items checked in the destination list.
Issue 3 - now uncheck the item then move it back to the select list, using the To Top button. Back to the Red style???
All these issues are related - the list is trying to preserve item state. I need it to forget the item state and just let the items fall back to their default state so they can be predictably manipulated.
There is also a block of code commented out in the .js file in which I explicitly remove all the changes I make to the items. This code doesn't work either, as spans get moved around when the listbox is trying to preserve their state.
Thanks in advance for your input.
JD
C#:
public
class
UserControl1 : WebControl
{
private
RadListBox _RlbItemSelect =
new
RadListBox();
private
RadListBox _RlbItemDestination =
new
RadListBox();
private
Panel _ListDiv =
new
Panel();
private
Button _Button =
new
Button();
private
Label _Label1 =
new
Label();
private
Button _Button2 =
new
Button();
HtmlGenericControl _TestList =
new
HtmlGenericControl(
"ul"
);
HtmlButton _TestButton =
new
HtmlButton();
void
_Button_Click(
object
sender, EventArgs e)
{
_Label1.Text =
"Postback"
;
_RlbItemSelect.Items.Add(
new
RadListBoxItem(
"This is another item, added after postback"
));
}
protected
override
void
OnInit(EventArgs e)
{
base
.OnInit(e);
_Label1.ID =
"_Label1"
;
_Label1.Text =
"Initial Load"
;
_Button.Text =
"RefreshPage"
;
_Button.ID =
"_Button"
;
_Button.Click += _Button_Click;
this
.Page.Form.Controls.Add(_Button);
this
._ListDiv.Controls.Add(_Label1);
this
.Controls.Add(_ListDiv);
this
._ListDiv.Controls.Add(
new
LiteralControl(
"<br/><br/><span id style=\"text-align:left;\">Title</span><br/>"
));
this
._RlbItemSelect.ID =
"_RlbItemSelect"
;
this
._RlbItemSelect.Height = Unit.Pixel(200);
this
._RlbItemSelect.Width = Unit.Pixel(800);
this
._RlbItemSelect.AllowTransfer =
true
;
this
._RlbItemSelect.AllowReorder =
false
;
this
._RlbItemSelect.AllowTransferOnDoubleClick =
true
;
this
._RlbItemSelect.TransferToID =
"_RlbItemDestination"
;
this
._RlbItemSelect.ButtonSettings.Position = ListBoxButtonPosition.Bottom;
this
._RlbItemSelect.ButtonSettings.HorizontalAlign = ListBoxHorizontalAlign.Center;
this
._RlbItemSelect.ButtonSettings.RenderButtonText =
true
;
this
._RlbItemSelect.CssClass +=
" PopDualListHgSelect"
;
this
._RlbItemDestination.ClientIDMode = System.Web.UI.ClientIDMode.Static;
this
._RlbItemDestination.ID =
"_RlbItemDestination"
;
this
._RlbItemDestination.Height = Unit.Pixel(200);
this
._RlbItemDestination.Width = Unit.Pixel(800);
this
._RlbItemDestination.EmptyMessage =
"Must choose at least one gateway pop"
;
this
._RlbItemDestination.CheckBoxes =
true
;
this
._RlbItemDestination.CssClass +=
" PopDualListHgDestination"
;
this
._RlbItemDestination.SelectionMode = ListBoxSelectionMode.Single;
this
._RlbItemDestination.OnClientItemChecking =
"singleSelectionInHgDestLb"
;
this
._RlbItemDestination.PersistClientChanges =
true
;
this
._RlbItemDestination.EnableViewState =
true
;
this
._ListDiv.Controls.Add(
this
._RlbItemSelect);
this
._ListDiv.Controls.Add(
new
LiteralControl(
"<br/>"
));
this
._ListDiv.Controls.Add(
this
._RlbItemDestination);
this
._ListDiv.Controls.Add(
new
LiteralControl(
"<br/>"
));
if
(!Page.IsPostBack)
{
_RlbItemSelect.Items.Add(
new
RadListBoxItem(
"This is item 1"
));
_RlbItemSelect.Items.Add(
new
RadListBoxItem(
"This is item 2"
));
_RlbItemSelect.Items.Add(
new
RadListBoxItem(
"This is item 3"
));
_RlbItemSelect.Items.Add(
new
RadListBoxItem(
"This is item 4"
));
}
Page.ClientScript.RegisterClientScriptInclude(
"scripts/listBox.js"
,
"scripts/listBox.js"
);
}
}
Javascript:
function
singleSelectionInHgDestLb(sender, args) {
var
item = args.get_item();
var
lb = item.get_listBox();
lb.trackChanges();
var
items = sender.get_items();
var
checked = item.get_checked();
var
ele = $(item.get_element());
if
(checked ==
false
) {
clearChecks(items);
ele.closest(
".rlbItem"
).find(
"label"
).SetHgSpanText(
true
);
}
else
{
ele.closest(
".rlbItem"
).find(
"label"
).SetHgSpanText(
false
);
}
lb.commitChanges();
}
function
clearChecks(items) {
items.forEach(
function
(itm) {
itm.set_checked(
false
);
var
ele = $(itm.get_element());
ele.closest(
".rlbItem"
).find(
"label"
).SetHgSpanText(
false
);
});
}
(
function
($) {
$.fn.SetHgSpanText =
function
(isPrimary) {
var
setText =
"SECONDARY"
;
var
color =
"blue"
;
if
(isPrimary) { setText =
"PRIMARY"
; color =
"red"
; }
if
($(
this
).find(
".hgInd"
).length) {
$(
this
).find(
".hgInd"
).text(
"("
+ setText +
") "
);
$(
this
).find(
".hgInd"
).attr(
"style"
,
"color: "
+ color +
"; font-size: 8pt"
);
}
else
{
$(
this
).find(
".rlbCheck"
).after(
"<span class='hgInd' style='color: "
+ color +
"; font-size: 8pt' class='rlbSpan'>("
+ setText +
") </span>"
);
}
$(
this
).find(
".rlbText"
).removeAttr(
"style"
);
};
})(jQuery);
$(
function
() {
$(
"#main"
).on(
"DOMNodeInserted"
,
".PopDualListHgDestination .rlbList"
,
function
(e) {
if
($(e.target).is(
".rlbItem"
)) {
var
checked = $(e.target).find(
".rlbCheck[checked='checked']"
).length > 0;
$(e.target).find(
"label"
).SetHgSpanText(checked);
}
});
});
////This cleanup does method not work
//$(function () {
// $("#main").on("DOMNodeInserted", ".PopDualListHgSelect .rlbList", function (e) {
// if ($(e.target).is(".rlbItem")) {
// $(e.target).find(".hgInd").remove();
// $(e.target).find(".rlbText").removeAttr("style");
// }
// });
//});
$(document).ready(
function
() {
$(
"#main"
).find(
".PopDualListHgDestination .rlbCheck[checked='checked']"
).closest(
"label"
).SetHgSpanText(
true
);
$(
"#main"
).find(
".PopDualListHgDestination .rlbCheck[checked!='checked']"
).closest(
"label"
).SetHgSpanText(
false
);
});