Updating treeview

Asked

Viewed 247 times

3

I have an application that uses a treeview as image and code below. inserir a descrição da imagem aqui

ASPX:

<%@ Page Title="" Language="C#" MasterPageFile="~/FrontPage.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="IASD.ASCS.WebForm.register.group.Default" %>

<%@ MasterType VirtualPath="~/FrontPage.Master" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<link href="../../Content/template.css" rel="stylesheet" />
<link href="../../Content/validationEngine.jquery.css" rel="stylesheet" />

<script src="../../Scripts/jquery-1.6.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../../Scripts/jquery.validationEngine.js" type="text/javascript" charset="utf-8"></script>
<script src="../../Scripts/jquery.validationEngine-pt_BR.js" type="text/javascript" charset="utf-8"></script>

<script type="text/javascript">
    function TreeNodeCheckChanged(event, control) {
        // Valid for IE and Firefox/Safari/Chrome.
        var obj = window.event ? window.event.srcElement : event.target;
        var source = window.event ? window.event.srcElement.id : event.target.id;
        source = source.replace(control.id + "t", control.id + "n");
        var checkbox = document.getElementById(source);
        if (checkbox != null && obj.tagName == "INPUT" && obj.type == "checkbox") {
            __doPostBack(checkbox.id, "");
        }
    }

    function validate() {
        //Campo Nome
        if (document.getElementById("<%=txtGroupName.ClientID%>").value.trim() == "") {
            alert("Informe o Nome");
            document.getElementById("<%=txtGroupName.ClientID%>").focus();
            return false;
        } txtGroupName
    }

    jQuery(document).ready(function () {

        jQuery("#form1").validationEngine();
    });

</script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div class="buttons">
    <asp:ImageButton ID="btnNew" runat="server" ImageUrl="~/Images/New_4.png" OnClick="btnNew_Click" ToolTip="Novo Grupo" />
    <asp:ImageButton ID="btnDelete" runat="server" ImageUrl="~/Images/exclude_G.png" OnClick="btnDelete_Click" ToolTip="Excluir Grupo" />
    <asp:ImageButton ID="btnSave" runat="server" ImageUrl="~/Images/save_all.ico" OnClick="btnSave_Click" ToolTip="Salvar Grupo" ValidationGroup="vsGroup" OnClientClick=" return validate()" />
</div>
<div class="esp_campo">
    <cc1:TabContainer ID="TabGroup" runat="server" TabIndex="0" Width="100%" CssClass="ajax__myTab" ActiveTabIndex="0">
        <cc1:TabPanel runat="server" HeaderText="Grupo" ID="tbgroups">
            <HeaderTemplate>Grupo</HeaderTemplate>
            <ContentTemplate>
                <div class="control-group">
                    <asp:Label ID="lbName" runat="server" Text="Nome"></asp:Label>
                    <div class="controls">
                        <asp:TextBox ID="txtGroupName" CssClass="textbox_search" runat="server"></asp:TextBox><asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtGroupName" ErrorMessage="Preencha o campo 'Nome'!" ValidationGroup="vsGroup"></asp:RequiredFieldValidator><asp:HiddenField ID="hfGrupoID" runat="server" />
                    </div>
                </div>
                <div class="GridMain">
                    <asp:GridView ID="gvGroup" Width="100%" runat="server" CssClass="GridViewUser" GridLines="None"
                        CellPadding="4" AutoGenerateColumns="False" OnRowDeleting="gvGroup_RowDeleting"
                        OnRowUpdating="gvGroup_RowUpdating" ForeColor="#333333">

                        <AlternatingRowStyle CssClass="GridAlternativeUser" BackColor="White" />
                        <Columns>
                            <asp:BoundField HeaderText="ID" DataField="GroupID" />
                            <asp:BoundField HeaderText="Nome" DataField="Name" />
                            <asp:ButtonField ButtonType="Image" CommandName="Update" ImageUrl="~/images/edit_.png">
                                <FooterStyle Width="50px" />
                                <HeaderStyle Width="50px" />
                                <ItemStyle Width="50px" />
                            </asp:ButtonField>
                            <asp:ButtonField ButtonType="Image" CommandName="Delete" ImageUrl="~/images/Grids_Deletes.png" />
                        </Columns>
                        <EditRowStyle BackColor="#2461BF" />
                        <FooterStyle BackColor="#507CD1" ForeColor="White" Font-Bold="True" />
                        <HeaderStyle CssClass="GridHeaderGroup" BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                        <PagerSettings PageButtonCount="5" />
                        <PagerStyle CssClass="GridPagerGroup" BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                        <RowStyle CssClass="GridRowGroup" BackColor="#EFF3FB" />
                        <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                        <SortedAscendingCellStyle BackColor="#F5F7FB" />
                        <SortedAscendingHeaderStyle BackColor="#6D95E1" />
                        <SortedDescendingCellStyle BackColor="#E9EBEF" />
                        <SortedDescendingHeaderStyle BackColor="#4870BE" />
                    </asp:GridView>
                </div>
                <asp:ValidationSummary ID="vsGroup" runat="server" ValidationGroup="vsGroup" ForeColor="Red" />

            </ContentTemplate>
        </cc1:TabPanel>
        <cc1:TabPanel runat="server" HeaderText="Menus" ID="tbMenus">
            <HeaderTemplate>Menus Por Grupo</HeaderTemplate>
            <ContentTemplate>
                <div class="page_name">
                    <asp:Label ID="lblTabName" runat="server" Text="Menus do Grupo"></asp:Label>
                </div>
                <br />
                <div class="forms">
                    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                        <ContentTemplate>
                            <asp:TreeView ID="treeMenu" runat="server" CssClass="AspNet-TreeView" ShowLines="True"
                                ShowCheckBoxes="All" OnTreeNodeCheckChanged="treeMenu_TreeNodeCheckChanged" ShowExpandCollapse="True"
                                Enabled="true">
                                <RootNodeStyle CssClass="AspNet-TreeView-Root" />
                            </asp:TreeView>
                        </ContentTemplate>
                        <Triggers>
                            <asp:AsyncPostBackTrigger ControlID="treeMenu" EventName="TreeNodeCheckChanged" />
                        </Triggers>
                    </asp:UpdatePanel>
                </div>

            </ContentTemplate>
        </cc1:TabPanel>
    </cc1:TabContainer>
</div>
</asp:Content>

Code Behind:

protected void gvGroup_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        IB.Group obj = IB.Group.GroupItem(int.Parse(gvGroup.Rows[e.RowIndex].Cells[0].Text));

        hfGrupoID.Value = obj.GroupID.ToString();
        txtGroupName.Text = obj.Name.ToString();

        btnDelete.Visible = true;
        tbMenus.Enabled = true;

        TabGroup.ActiveTab = tbMenus;


        WebTreeView.ClearTreeView(treeMenu.Nodes);

        Business.MenuItem.MountGroupTreeView(treeMenu.Nodes, Master.listMenuGroup, null);
        treeMenu.Attributes.Add("onclick", "TreeNodeCheckChanged(event, this)");
        treeMenu.ExpandDepth = 0;

        Business.MenuItem.CheckTreeView(treeMenu.Nodes, Business.MenuItem.ListMenubyGroup(int.Parse(hfGrupoID.Value)));
//
    }

When you click on an update button you should open the screen according to the image above to configure the type of access per group.

The problem that occurs is that each time you click on the update button you duplicate the menus per group.

In the image below was clicked three times in the edit menu and tripled the menu options per group. inserir a descrição da imagem aqui

Could anyone help? I’m not sure where the problem is.

The method that cleans treeview

public static void ClearTreeView(TreeNodeCollection NodeCollection)
    {
        foreach (TreeNode item in NodeCollection)
        {
            item.Checked = false;

            item.ImageUrl = "";

            if (item.ChildNodes.Count > 0)
                ClearTreeView(item.ChildNodes);

        }
    }

The method that mounts treeview

 public static void MountGroupTreeView(WC.TreeNodeCollection cItens, List<MenuItem> listMenuGroup, int? ParentMenuItemID)
    {
        foreach (MenuItem ttItem in listMenuGroup.FindAll(p => p.ParentMenuItemID == ParentMenuItemID))
        {
            WC.TreeNode newItem = new WC.TreeNode(ttItem.NameMenuItem, ttItem.MenuItemID.ToString());
            newItem.SelectAction = WC.TreeNodeSelectAction.None;

            cItens.Add(newItem);

            if (listMenuGroup.FindAll(p => p.ParentMenuItemID == ttItem.ParentMenuItemID).Count > 0)
                MountGroupTreeView(newItem.ChildNodes, listMenuGroup, ttItem.MenuItemID);
        }
    }
  • I had to make one also that by the way had several nodes, prefer to use a plugin Jquery. You do not think better?

2 answers

2

The answer may be somewhat vague but it seems that the problem may lie in the fact that

WebTreeView.ClearTreeView(treeMenu.Nodes);

not clean Treeview properly. Since items are added to Tree again, this would explain why items are duplicated each time there is an upgrade.

  • includes this method above and Aparentemete it does the cleaning properly.

  • 2

    From what I understood the Cleartreeview method, despite cleaning the state of the item, it never erases the items that are in Nodecollection. Calling Nodecollection.Clear() should solve the problem.

2


Try this...

treeMenu.Nodes.Clear();

Browser other questions tagged

You are not signed in. Login or sign up in order to post.