Rather than starting from scratch, I chose to start my control inheriting from the Panel control. This allows you to add any arbitrary content to the "draggable" item control, as it is translated to a span tag in HTML. In order to make the control "ATLAS-enabled" you need to implement the IScriptControl interface. The control's class declaration should be something similar to this:
public class DraggablePanel : System.Web.UI.WebControls.Panel, IScriptControl
Next you need to make sure to get a reference of the page's ScriptManager and register the control, and optionally you may want to add a reference to the AtlasUIDragDrop library to save you from doing that in the main page:
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (!DesignMode)
{
ScriptManager scriptManager = ScriptManager.GetCurrent(Page);
if (scriptManager != null)
{
scriptManager.RegisterControl(this);
scriptManager.RegisterScriptReference(
FrameworkScript.AtlasUIDragDrop);
}
}
}
Next, the only method from the IScriptControl interface that must be implemented is the RenderScript method. The goal of the custom control is to output the following XML-Script:
<control id="webPart1">
<behaviors>
<draggablelistitem handle="webPart1Title">
</behaviors>
</control>
The RenderScript implementation will output the XML-Script above, using the control's id and the panel control's id as the handle:
public void RenderScript(ScriptTextWriter writer)
{
//Outputs control tag
GenericScriptComponent gsc = new GenericScriptComponent(
new ScriptTypeDescriptor("control",
ScriptNamespace.Default));
//Outputs behaviors tag
gsc.ID = this.ClientID;
GenericScriptComponent draggableBehavior =
new GenericScriptComponent(
new ScriptTypeDescriptor("draggableListItem",
ScriptNamespace.Default));
draggableBehavior.AddValueProperty("handle", this.ClientID);
gsc.AddCollectionItem("behaviors", draggableBehavior);
((IScriptObject)gsc).RenderScript(writer);
}
9 comments:
Hi, this is exactly what I've been looking for, but do have any sample pages that I could at? Thanks.
The code to add controls dynamically in your page is fairly simple, here's a sample:
for (int i=0; i<5; i++) {
DraggablePanel panel = new DraggablePanel();
panel.Controls.Add(new Label(i.ToString()));
//list is a runat server div element
this.list.Controls.Add(panel);
}
I'm a little new to Atlas, but I'm having problems implementing iScriptControl. Is there a DLL I need to reference? I get a "Namespace could not be found" for the following line. Thanks.
public class DraggablePanel : System.Web.UI.WebControls.Panel, iScriptControl
Yes you need to add the Microsoft.Web.Atlas.dll assembly, you can get it from here:
Colin,
To programatically add DraggablePanel controls, you need to:
1. Add a HTML control (e.g. a div or td element) with the runat server attribute:
>td id="queueList" runat="server"<
2. Then you also need in your XML-Script to add the DragDropList behavior to this HTML element (the control id needs to match the HTML element id):
<control id="queueList">
<behaviors>
<dragDropList dataType="HTML" acceptedDataTypes="'HTML'" dragMode="Move">
<dropCueTemplate />
3. Finally you can programmatically add DraggablePanel instances to the Controls collection of your HTML element:
this.queueList.Controls.Add(draggablePanel);
Hey, Jorge Balderas
Thank you very much for this knowledge share. It helped me a lot with implementing some of my requirements. Keep sharing your remarkable thoughts.
Lior
Hi, I followed your example code and managed to get things to work, the only proble is, it only works in IE.
I've got a post about it here
Any thoughts?
Finally!!! after so much of googling I found your blog! excellent work Jorge.
But as kinsey said it doesn't work in Firefox. Could you please let us know if you have any solution for this problem?
Thanks.
Ignore my previous comment Jorge. It works on Firefox as well! that was just a javascript error in my code ...Okay, I need sleep :)
Post a Comment