asp.net 动态创建树视图

snz8szmq  于 9个月前  发布在  .NET
关注(0)|答案(2)|浏览(94)

我正在尝试使用c#和ASP.NET动态创建一个树视图。
我使用populate ondemand属性创建了一个延迟加载树视图。

>  <asp:TreeView ID="treeView1"  runat="server" 
>              OnTreeNodePopulate="treeview1_TreeNodePopulate"></asp:TreeView>

字符串
在代码后面,我已经加载了数据,但最初我填充父节点。我想要实现的是,当我单击父节点时,我会执行回发,然后填充其子节点,然后再次填充其子节点,现在就是这样。我有数千个数据,因此我不希望由于性能原因而填充所有数据。这就是为什么我只想基于选定节点填充节点查尔兹的原因。请参阅示例如下:

>Peter
    - - >user1
    - - >user2
    - - >user3
       - - >userPassword
       - - >userId
>john
>david
>Jack
    - - >user1
    - - >user2
       - - >userpassword
       - - >userId
       - - >Permissions
>Laura 
    - - > admin
    - - > permissions
       -- > user1
       -- > user2
         - - >userpassword
             - - >userId
             - - >Permissions           
>...
>...
>...


正如你所看到的,可以有多个父节点和多个层。这些将根据我传递给DB的内容动态填充。每次我点击节点,它都会展开节点并使用回发填充其子节点,然后当你再次点击其子节点时,它会再次回发并填充其子节点等。所以我想知道如何创建动态树视图。
c#:

private void LoadTreeview()
{
 //Load data
 // Get data from DB.
 //loop through the list and build its parent nodes.
  foreach (var dxm in list)
  {
                TreeNode tnParent = CheckNodeExist(dxm.Node); //I check to see if exists.
                if (tnParent== null)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dxm.Node;
                    tn.Value = dxm.Id.ToString();
                    tn.SelectAction = TreeNodeSelectAction.None;
                    tn.Collapse();
                    treeView1.Nodes.Add(tn);
                    tn.PopulateOnDemand = true; //lazy load
                    tnParent= tn;
                }

}


上面的方法在页面加载时调用。
在TreeNodePopulateEvent上:(单击节点时)

protected void treeview1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
        {
            ICollection<ITEMS> list = new Collection<ITEMS>();           

            list = GetData(e.Node.Text); //pass in the node you have selected  this will go and check in DB if the node does have any child nodes. If so will return with child nodes.

            foreach (var dxm in list)
            {

                TreeNode tnChild = CheckNodeExist(dxm.Node);
                if (tnChild == null)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dxm.Node;
                    tn.Value = dxm.Id.ToString();
                    tn.SelectAction = TreeNodeSelectAction.None;
                    tn.Collapse();

                    tn.PopulateOnDemand = true;
                    tnChild = tn;
                    tnChild.ChildNodes.Add(tnChild);                  

                }
            }
        }

qvtsj1bj

qvtsj1bj1#

我相信你正在寻找SelectedNodeChanged事件。你应该能够在这个事件中加载你的子节点。基本上,这个事件将在你每次点击一个节点时被触发。
你的aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!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">
    <div id="div1" runat="server">

    </div>

    <asp:TreeView ID="TreeView1" runat="server" 
        onselectednodechanged="TreeView1_SelectedNodeChanged">

    </asp:TreeView>

    </form>
</body>
</html>

字符串
您的代码隐藏

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            TreeView1.Nodes.Add(new TreeNode("Node1"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("ChildNode"));
        }

    }

    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
        Response.Write(TreeView1.SelectedNode.Text);
    }
}

332nm8kg

332nm8kg2#

也许这个例子会帮助你在这里我创建用户树一样的结构在.NET核心mvc使用baisc递归。
这里我使用SQL Server来存储用户数据,每个节点/用户都由用户名来标识。每个节点都是indival用户。登录用户将显示在顶部,底部有子用户,形成一个类似于左成员/左节点和右成员/右节点的树结构。
型号类别:

public class UserModel
 {
     [Key]
     public int userId { get; set; }
     [Required]
     public string firstName { get; set; }
     [Required]
     public string lastName { get; set; }
     [Required]
     public string userName { get; set; }
     [Required]
     public string password { get; set; }
     public string leftMember { get; set; } = "";
     public string rightMember { get; set; } = "";
 }

字符串
用户登录验证:

[HttpPost]
public async Task<IActionResult> Auth(string username, string password)
{
    
    var findingFeni = context.User.Where(n => n.userName == username && n.password == password).FirstOrDefault();
    
    if(findingFeni == null)
    { 
        return Content("user or password is incorrect");
    }

    var claims = new List<Claim>
    {
        new Claim(ClaimTypes.Name, username)
    };

    var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);

    var authProperties = new AuthenticationProperties
    {
         
    };

    await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,
        new ClaimsPrincipal(claimsIdentity), authProperties);
     
    return RedirectToAction("Index");
      
}


添加左和右成员/节点:

public async Task<IActionResult> addMyLeftMember(int userId)
{ 
    TempData["LeftMemberUserId"] = userId;
    return RedirectToAction("RegisterLeftMember");
}

public async Task<IActionResult> addMyRightMember(int userId)
{
    TempData["RightMemberUserId"] = userId;
    return RedirectToAction("RegisterRightMember");
}

public async Task<IActionResult> AddMemberLeft(UserModel userModel)
{

    UserModel usr = context.User.Where(n => n.userName == userModel.userName).FirstOrDefault();

    if(usr != null)
    {
        return Content("user already exist");
    }

    int userID = int.Parse(TempData["LeftMemberUserId"].ToString());
    var findingDaddy = context.User.Where(n => n.userId == userID).FirstOrDefault();
     

    findingDaddy.leftMember = userModel.userName;

    context.User.Add(userModel);
    await context.SaveChangesAsync();

    return RedirectToAction("Index");
}

public async Task<IActionResult> AddMemberRight(UserModel userModel)
{

    UserModel usr = context.User.Where(n => n.userName == userModel.userName).FirstOrDefault();

    if (usr != null)
    {
        return Content("user already exist");
    }

    int userID = int.Parse(TempData["RightMemberUserId"].ToString());
    var findingDaddy = context.User.Where(n => n.userId == userID).FirstOrDefault();

    findingDaddy.rightMember = userModel.userName;

    context.User.Add(userModel);
    await context.SaveChangesAsync();

    return RedirectToAction("Index");
}


fetching user data in index我正在获取所有用户的数据,但你只能获取登录用户的数据,这将完成这项工作。

public IActionResult Index()
 { 
     List<UserModel> users = context.User.ToList();
      
     string name = User.Identity.Name;

     if(name == null || name.Equals(""))
     {
         name = "admin";
     }
      
     List<UserModel> newUserList = users.Where(user => String.Compare(user.userName, User.Identity.Name) >= 0).ToList();
     return View(newUserList);
      
 }


首页:

@inject TASK_1._1.Context.ApplicationDbContext context
@model List<UserModel> 
@{
    ViewData["Title"] = "Home Page"; 
}
   
<div class="text-center">
    @if (Model != null && Model.Count() > 0)
    {  
        <table border="1" class="text-center">  
            @foreach (var user in Model)
            { 
                @Html.Partial("_UserNodeView", user)
                break;
            }
        </table> 
    }
</div>


检视:

@inject TASK_1._1.Context.ApplicationDbContext context
@model UserModel
@*
     
*@
@{
}

<table border="1" class="text-center">
    <a> @Model.userName </a>
        <tr>
            <td>
            @if (Model.leftMember.Equals(""))
                {
                    <div>
                        <form asp-controller="Home" asp-action="AddMyLeftMember" method="post">
                        <button class="btn btn-primary" type="submit" asp-action="AddMyLeftMember" asp-route-userId="@Model.userId"> Left </button>
                        </form>
                    </div>
                }
                else
                {
                    var u = context.User.Where(n => n.userName == Model.leftMember).FirstOrDefault();
                    @Html.Partial("_UserNodeView", u)
                }
            </td>

            <td>
            @if (Model.rightMember.Equals(""))
                {
                    <div>
                        <form asp-controller="Home" asp-action="AddMyRightMember" method="post">
                        <button class="btn btn-primary" type="submit" asp-action="AddMyRightMember" asp-route-userId="@Model.userId"> Right </button>
                        </form>
                    </div>
                }
                else
                {
                    var u = context.User.Where(n => n.userName == Model.rightMember).FirstOrDefault();
                    @Html.Partial("_UserNodeView", u)
                }
            </td>
        </tr>
    
</table>

相关问题