This is a migrated thread and some comments may be shown as answers.

Big bug with docking .... need help

5 Answers 113 Views
Dock
This is a migrated thread and some comments may be shown as answers.
Martin Říha
Top achievements
Rank 1
Martin Říha asked on 10 Nov 2009, 09:37 AM
Hi, I´am using docks. I need dynamic add dock and  save it in Database. My problem is when I drag dock and move it, automaticaly create same dock on old place and this dock is not react. Could you help me this is my codedownloaded here http://mriha.asp2.cz/DynamicADDdock.rar

 

 

 

5 Answers, 1 is accepted

Sort by
0
Martin Říha
Top achievements
Rank 1
answered on 10 Nov 2009, 10:36 AM
Probles is in firefox in IE work good. could you help me?

my code

 

<form id="form1" runat="server">

 

 

<div>

 

 

 

<asp:Button ID="Button1" runat="server" Text="save" OnClientClick="getwidth()" />

 

 

<asp:ScriptManager ID="ScriptManager1" runat="server">

 

 

</asp:ScriptManager>

 

 

 

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

 

 

<ContentTemplate>

 

 

<asp:Panel ID="Panel1" runat="server">

 

 

</asp:Panel>

 

 

</ContentTemplate>

 

 

</asp:UpdatePanel>

 

 

 

</div>

 

 

 

 

</form>

 


 

RadDockLayout radLayout;

 

 

private SqlConnection _conn = new SqlConnection(ConfigurationManager.ConnectionStrings["TelerikDockConnectionString"].ConnectionString);

 

 

private int _count = 0;

 

 

private TextBox txt1;

 

 

private Label va;

 

 

 

private RadDockZone rdzPrvni;

 

 

private RadDockZone rdzDruhy;

 

 

private RadDockZone rdzTreti;

 

 

private DropDownList ddlwidget;

 

 

//public ArrayList GetZones()

 

 

//{

 

 

// ArrayList zones = new ArrayList();

 

 

// zones.Add(rdzPrvni);

 

 

// zones.Add(rdzDruhy);

 

 

// zones.Add(rdzTreti);

 

 

// return zones;

 

 

//}

 

 

private List<DockState> CurrentDockStates

 

{

 

get

 

{

 

//Get saved state string from the database - set it to dockState variable for example

 

 

string dockStatesFromDB = "";

 

_conn.Open();

 

SqlCommand command = new SqlCommand("select State from States where id=2", _conn);

 

dockStatesFromDB = command.ExecuteScalar().ToString();

_conn.Close();

 

List<DockState> _currentDockStates = new List<DockState>();

 

 

string[] stringStates = dockStatesFromDB.Split('|');

 

 

foreach (string stringState in stringStates)

 

{

 

if (stringState.Trim() != string.Empty)

 

{

_currentDockStates.Add(

DockState.Deserialize(stringState));

 

}

}

 

return _currentDockStates;

 

}

}

 

private RadDock CreateRadDock()

 

{

 

int docksCount = CurrentDockStates.Count;

 

 

RadDock dock = new RadDock();

 

dock.DockMode =

DockMode.Docked;

 

dock.UniqueName =

Guid.NewGuid().ToString();

 

dock.ID =

string.Format("RadDock{0}", dock.UniqueName);

 

dock.Title =

"Dock";

 

dock.Text =

string.Format("Added at {0}", DateTime.Now);

 

dock.Width =

Unit.Pixel(300);

 

dock.Commands.Add(

new DockCloseCommand());

 

dock.Commands.Add(

new DockExpandCollapseCommand());

 

 

return dock;

 

}

 

private void CreateSaveStateTrigger(RadDock dock)

 

{

 

//Ensure that the RadDock control will initiate postback

 

 

// when its position changes on the client or any of the commands is clicked.

 

 

//Using the trigger we will "ajaxify" that postback.

 

dock.AutoPostBack =

true;

 

dock.CommandsAutoPostBack =

true;

 

 

AsyncPostBackTrigger saveStateTrigger = new AsyncPostBackTrigger();

 

saveStateTrigger.ControlID = dock.ID;

saveStateTrigger.EventName =

"DockPositionChanged";

 

UpdatePanel1.Triggers.Add(saveStateTrigger);

saveStateTrigger =

new AsyncPostBackTrigger();

 

saveStateTrigger.ControlID = dock.ID;

saveStateTrigger.EventName =

"Command";

 

UpdatePanel1.Triggers.Add(saveStateTrigger);

}

 

private void LoadWidget(RadDock dock)

 

{

 

if (string.IsNullOrEmpty(dock.Tag))

 

{

 

return;

 

}

 

Control widget = LoadControl(dock.Tag);

 

dock.ContentContainer.Controls.Add(widget);

}

 

protected void ButtonAddDock_Click(object sender, EventArgs e)

 

{

 

RadDock dock = CreateRadDock();

 

 

//find the target zone and add the new dock there

 

 

RadDockZone dz = rdzPrvni;

 

dz.Controls.Add(dock);

CreateSaveStateTrigger(dock);

 

//Load the selected widget in the RadDock control

 

dock.Tag = ddlwidget.SelectedValue;

LoadWidget(dock);

}

 

 

protected void Page_Init(object sender, EventArgs e)

 

{

 

//s base.OnInit(e);

 

 

//Recreate the docks in order to ensure their proper operation

 

 

 

Panel addControl = new Panel();

 

 

 

 

Label lblddl = new Label();

 

lblddl.Text =

"vyberte komponentu ";

 

 

ddlwidget =

new DropDownList();

 

ddlwidget.ID =

"ddlwidget";

 

ddlwidget.Width = 150;

ddlwidget.Items.Add(

new ListItem("ExchangeRates.ascx", "~/DynamicData/FieldTemplates/ExchangeRates.ascx"));

 

ddlwidget.Items.Add(

new ListItem("news", "~/DynamicData/FieldTemplates/news.ascx"));

 

 

addControl.Controls.Add(lblddl);

addControl.Controls.Add(ddlwidget);

 

// DropDownList DropDownZone = new DropDownList();

 

 

//DropDownZone.DataSource=GetZones();

 

 

//DropDownZone.DataValueField="ClientID";

 

 

//DropDownZone.Width = 150;

 

 

//Label lblddlzone = new Label();

 

 

//lblddlzone.Text = "Vyberte zonu ";

 

 

//addControl.Controls.Add(lblddlzone);

 

 

//addControl.Controls.Add(DropDownZone);

 

 

Button btnAddDock = new Button();

 

btnAddDock.Text =

"Add Dock to zone 1";

 

btnAddDock.Click +=

new EventHandler(ButtonAddDock_Click);

 

addControl.Controls.Add(btnAddDock);

 

 

Button btnSaveState = new Button();

 

btnSaveState.Text =

"ulozit pozice ";

 

btnSaveState.Click +=

new EventHandler(btnSaveState_Click);

 

 

 

radLayout =

new RadDockLayout();

 

radLayout.EnableViewState =

false;

 

radLayout.StoreLayoutInViewState =

true;

 

radLayout.ID =

"RadDockLayout";

 

radLayout.SaveDockLayout +=

new DockLayoutEventHandler(RadDockLayout1_SaveDockLayout);

 

radLayout.LoadDockLayout +=

new DockLayoutEventHandler(RadDockLayout1_LoadDockLayout);

 

 

rdzPrvni =

new RadDockZone();

 

rdzPrvni.ID =

"RdzSklady";

 

rdzPrvni.Orientation =

Orientation.Vertical;

 

rdzPrvni.MinHeight = 100;

rdzPrvni.Width = 527;

rdzPrvni.CssClass =

"RadDcokZone";

 

 

radLayout.Controls.Add(rdzPrvni);

 

rdzDruhy =

new RadDockZone();

 

rdzDruhy.ID =

"RdzFinance";

 

rdzDruhy.MinHeight = 100;

rdzDruhy.Width = 527;

rdzDruhy.CssClass =

"RadDcokZone";

 

 

radLayout.Controls.Add(rdzDruhy);

 

 

 

 

 

rdzTreti =

new RadDockZone();

 

rdzTreti.ID =

"RdzInformace";

 

rdzTreti.CssClass =

"RadDcokZone";

 

rdzTreti.Width = 527;

rdzTreti.MinHeight = 100;

 

radLayout.Controls.Add(rdzTreti);

 

 

Panel1.Controls.Add(addControl);

Panel1.Controls.Add(radLayout);

 

for (int i = 0; i < CurrentDockStates.Count; i++)

 

{

 

if (CurrentDockStates[i].Closed == false)

 

{

 

RadDock dock = CreateRadDockFromState(CurrentDockStates[i]);

 

radLayout.Controls.Add(dock);

CreateSaveStateTrigger(dock);

LoadWidget(dock);

}

}

}

 

private RadDock CreateRadDockFromState(DockState state)

 

{

 

RadDock dock = new RadDock();

 

dock.DockMode =

DockMode.Docked;

 

dock.ID =

string.Format("RadDock{0}", state.UniqueName);

 

dock.ApplyState(state);

dock.Commands.Add(

new DockCloseCommand());

 

dock.Commands.Add(

new DockExpandCollapseCommand());

 

 

return dock;

 

}

 

void btnSaveState_Click(object sender, EventArgs e)

 

{

 

}

 

 

 

protected void RadDockLayout1_LoadDockLayout(object sender, DockLayoutEventArgs e)

 

{

 

foreach (DockState state in CurrentDockStates)

 

{

e.Positions[state.UniqueName] = state.DockZoneID;

e.Indices[state.UniqueName] = state.Index;

}

}

 

protected void RadDockLayout1_SaveDockLayout(object sender, DockLayoutEventArgs e)

 

{

 

List<DockState> stateList = radLayout.GetRegisteredDocksState();

 

 

StringBuilder serializedList = new StringBuilder();

 

 

int i = 0;

 

 

while (i < stateList.Count)

 

{

serializedList.Append(stateList[i].ToString());

serializedList.Append(

"|");

 

i++;

}

 

string dockState = serializedList.ToString();

 

 

if (dockState.Trim() != String.Empty)

 

{

_conn.Open();

 

SqlCommand command = new SqlCommand(String.Format("update States set State='{0}' where id=2", dockState), _conn);

 

command.ExecuteNonQuery();

_conn.Close();

}

}


0
Martin Říha
Top achievements
Rank 1
answered on 10 Nov 2009, 11:26 AM
I have windows 7 it could by problem here? In win xp work good? same problem like in my aplication is on yours website 
0
Accepted
Pero
Telerik team
answered on 11 Nov 2009, 02:23 PM
Hello Martin,

This error is encountered because of AJAX request conflict. When the RadDocks title-bar is clicked many times the DockPositionChanged event is fired more than once. Because the dock's AutoPostBack property is set to true, a couple of AJAX requests are fired even before any previous AJAX post back has finished. This on the other hand generates a duplicate of the RadDock and throws an exception.

You can overcome this error by adding an AJAX Loading Panel that will ensure the AJAX post back to be finished before a new one is started. For your convenience, I have attached a sample project, that shows this can be done.

Please do not hesitate to contact us, if you have any further questions.

Kind regards,
Pero
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
0
Martin Říha
Top achievements
Rank 1
answered on 13 Nov 2009, 08:20 AM
This is good, but this portal is very slowly. When you look on some portal they are quick http://www.netvibes.com/#General 
http://www.bbc.co.uk/home/ if you look on this examples you see that you can move dock how you want and work quick and good.
Do you have some Ideas?
Thanks
0
Pero
Telerik team
answered on 18 Nov 2009, 01:34 PM
Hi Martin,

Here are a couple ideas to improve the performance of an application that has dynamically created RadDocks:

1. Use a hidden UpdatePanel to add the docks to, so that when a certain RadDock is moved, closed, expanded/collapsed only this RadDock is updated. I have attached a sample project that demonstrates this approach.

2. Another idea is, to load the content inside the RadDocks using WebServices. We do not have such example and you should implement your own way of loading dynamic content through WebService.

3. Save the state of the RadDocks using WebServices. This way you do not have to make AJAX postbacks on every action you perform with the RadDock. We do not have an example that demonstrates this approach, and you should implement it yourself.


Greetings,
Pero
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
Tags
Dock
Asked by
Martin Říha
Top achievements
Rank 1
Answers by
Martin Říha
Top achievements
Rank 1
Pero
Telerik team
Share this question
or