I defined a RadTreeView using a template for nodes.
Every node must contain a dropDownList and a Label, filled from a DataTable.
I have 2 problems:
1) When i try Drag & Drop nodes i get an error derived from the DropDownList;
2) if i don't put the DropDownList in the Template (so only the Label) after the drag & drop i lost the template and data fails.
How can i solve this 2 problems?
Above the code.
Thanks a lot.
Every node must contain a dropDownList and a Label, filled from a DataTable.
I have 2 problems:
1) When i try Drag & Drop nodes i get an error derived from the DropDownList;
2) if i don't put the DropDownList in the Template (so only the Label) after the drag & drop i lost the template and data fails.
How can i solve this 2 problems?
Above the code.
Thanks a lot.
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> |
<%@ Register assembly="Telerik.Web.UI" namespace="Telerik.Web.UI" tagprefix="telerik" %> |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
<html xmlns="http://www.w3.org/1999/xhtml"> |
<head runat="server"> |
<title></title> |
</head> |
<body> |
<form id="form1" runat="server"> |
<asp:ScriptManager ID="ScriptManager1" runat="server"> |
</asp:ScriptManager> |
<div> |
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> |
<ContentTemplate> |
<telerik:RadTreeView ID="RadTreeView1" Runat="server" EnableDragAndDrop="True" EnableDragAndDropBetweenNodes="True" Skin="Outlook" > |
</telerik:RadTreeView> |
</ContentTemplate> |
</asp:UpdatePanel> |
</div> |
</form> |
</body> |
</html> |
Option Strict On |
Imports System.Data |
Imports System.Web.UI |
Imports Telerik.Web.UI |
Partial Class _Default : Inherits System.Web.UI.Page |
Dim myDataSet As DataSet |
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load |
If Not Page.IsPostBack Then |
myDataSet = New DataSet |
Dim tb As DataTable = New DataTable("Prova") |
tb.Columns.Add(New DataColumn("id")) |
tb.Columns.Add(New DataColumn("name")) |
tb.Columns.Add(New DataColumn("code")) |
tb.Columns.Add(New DataColumn("parent")) |
tb.Columns.Add(New DataColumn("sign")) |
myDataSet.Tables.Add(tb) |
Dim row As DataRow = myDataSet.Tables("Prova").NewRow() |
row("id") = 1 |
row("name") = "total" |
row("code") = 0 |
row("parent") = DBNull.Value |
row("sign") = DBNull.Value |
myDataSet.Tables("Prova").Rows.Add(row) |
row = myDataSet.Tables("Prova").NewRow() |
row("id") = 2 |
row("name") = "liv1" |
row("code") = 1 |
row("parent") = 0 |
row("sign") = "+" |
myDataSet.Tables("prova").Rows.Add(row) |
row = myDataSet.Tables("Prova").NewRow() |
row("id") = 3 |
row("name") = "liv2" |
row("code") = 2 |
row("parent") = 0 |
row("sign") = "-" |
myDataSet.Tables("prova").Rows.Add(row) |
row = myDataSet.Tables("Prova").NewRow() |
row("id") = 4 |
row("name") = "sub-liv1" |
row("code") = 3 |
row("parent") = 1 |
row("sign") = "tilde" |
myDataSet.Tables("prova").Rows.Add(row) |
Dim keyColumn(1) As DataColumn |
keyColumn(0) = myDataSet.Tables("Prova").Columns.Item("id") |
myDataSet.Tables("Prova").PrimaryKey = keyColumn |
RadTreeView1.NodeTemplate = New myNodeTemplate(myDataSet) |
RadTreeView1.DataSource = myDataSet.Tables("Prova") |
RadTreeView1.DataTextField = "name" |
RadTreeView1.DataFieldID = "code" |
RadTreeView1.DataFieldParentID = "parent" |
RadTreeView1.DataValueField = "id" |
RadTreeView1.DataBind() |
RadTreeView1.ExpandAllNodes() |
Session("RicordaDataSet") = myDataSet |
Else |
myDataSet = CType(Session("RicordaDataSet"), DataSet) |
End If |
End Sub |
Protected Sub RadTreeView1_HandleDrop(ByVal sender As Object, ByVal e As RadTreeNodeDragDropEventArgs) Handles RadTreeView1.NodeDrop |
Dim sourceNode As RadTreeNode = e.SourceDragNode |
Dim destNode As RadTreeNode = e.DestDragNode |
Dim dropPosition As RadTreeViewDropPosition = e.DropPosition |
If destNode IsNot Nothing Then |
If (sourceNode.TreeView.SelectedNodes.Count <= 1) Then |
PerformDragAndDrop(dropPosition, sourceNode, destNode) |
ElseIf (sourceNode.TreeView.SelectedNodes.Count > 1) Then |
For Each node As RadTreeNode In sourceNode.TreeView.SelectedNodes |
PerformDragAndDrop(dropPosition, node, destNode) |
Next |
End If |
destNode.Expanded = True |
sourceNode.TreeView.ClearSelectedNodes() |
End If |
End Sub |
Private Sub PerformDragAndDrop(ByVal dropPosition As RadTreeViewDropPosition, ByVal sourceNode As RadTreeNode, ByVal destNode As RadTreeNode) |
If (sourceNode.Equals(destNode) OrElse sourceNode.IsAncestorOf(destNode)) Then |
Return |
End If |
sourceNode.Owner.Nodes.Remove(sourceNode) |
Select Case (dropPosition) |
Case RadTreeViewDropPosition.Over ' child |
If Not sourceNode.IsAncestorOf(destNode) Then |
modifyDataSetAfterDragAndDrop(sourceNode, destNode, 1) |
destNode.Nodes.Add(sourceNode) |
End If |
Case RadTreeViewDropPosition.Above ' sibling - above |
modifyDataSetAfterDragAndDrop(sourceNode, destNode, 0) |
destNode.InsertBefore(sourceNode) |
Case RadTreeViewDropPosition.Below ' sibling - below |
modifyDataSetAfterDragAndDrop(sourceNode, destNode, 0) |
destNode.InsertAfter(sourceNode) |
End Select |
End Sub |
Protected Sub modifyDataSetAfterDragAndDrop(ByVal sourceNode As RadTreeNode, ByVal destNode As RadTreeNode, ByVal flag As Integer) |
Dim sourceRow As DataRow = myDataSet.Tables("Prova").Rows.Find(sourceNode.Value) |
Dim destRow As DataRow = myDataSet.Tables("Prova").Rows.Find(destNode.Value) |
If flag = 1 Then ' Nodo spostato a sotto-nodo di un altro |
sourceRow("parent") = destRow("code") |
Else ' Nodo inserito tra altri 2 nodi |
sourceRow("parent") = destRow("parent") |
End If |
End Sub |
Class myNodeTemplate : Implements ITemplate |
Dim myDataSetHere As DataSet |
Sub New(ByVal type As DataSet) |
myDataSetHere = type |
End Sub |
Public Sub InstantiateIn(ByVal container As Control) Implements ITemplate.InstantiateIn |
Dim ddl1 As New DropDownList() |
ddl1.Items.Add(New ListItem("Nothing", DBNull.Value.ToString)) |
ddl1.Items.Add(New ListItem("+", "+")) |
ddl1.Items.Add(New ListItem("-", "-")) |
ddl1.Items.Add(New ListItem("tilde", "tilde")) |
ddl1.ID = "ItemDropDownList" |
ddl1.Text = "Text" |
Dim label1 As New Label() |
label1.ID = "ItemLabel" |
label1.Text = "Text" |
label1.Font.Size = 10 |
label1.Font.Bold = True |
AddHandler label1.DataBinding, AddressOf label1_DataBinding |
AddHandler ddl1.DataBinding, AddressOf ddl1_DataBinding |
container.Controls.Add(ddl1) |
Dim ll As Label = New Label |
ll.Text = " " |
container.Controls.Add(ll) |
container.Controls.Add(label1) |
End Sub |
Private Sub label1_DataBinding(ByVal sender As Object, ByVal e As EventArgs) |
Dim target As Label = DirectCast(sender, Label) |
Dim node As RadTreeNode = DirectCast(target.BindingContainer, RadTreeNode) |
Dim nodeText As String = DirectCast(DataBinder.Eval(node, "Text"), String) |
target.Text = nodeText |
End Sub |
Private Sub ddl1_DataBinding(ByVal sender As Object, ByVal e As EventArgs) |
Dim target As DropDownList = DirectCast(sender, DropDownList) |
Dim node As RadTreeNode = DirectCast(target.BindingContainer, RadTreeNode) |
Dim nodeId As String = node.Value |
Dim keyColumn(1) As DataColumn |
keyColumn(0) = myDataSetHere.Tables("Prova").Columns.Item("id") |
myDataSetHere.Tables("Prova").PrimaryKey = keyColumn |
Dim row As DataRow = myDataSetHere.Tables("Prova").Rows.Find(node.Value) |
target.SelectedValue = row("sign").ToString |
End Sub |
End Class |
End Class |