gpt4 book ai didi

c# - 如何通过回发维护 TreeView 用户交互?

转载 作者:行者123 更新时间:2023-11-30 19:44:20 24 4
gpt4 key购买 nike

我在母版页中使用 RadTreeView:

但是我遇到了以下问题:

当我单击 TreeView 的节点时,我失去了我的选择。每次我单击该节点时,它都会生成 (Response.Redirect("...")) 这使得掌握输入 (!Page.IsPostback)每次都重新绑定(bind) TreeView ,所以我失去了我的选择。

如何解决这个问题。

我的.aspx:

 <telerik:RadTreeView ID="rtv_cm" runat="server" OnNodeExpand="rtv_cm_NodeExpand"
OnNodeClick="rtv_cm_NodeClick" Skin="WebBlue">
</telerik:RadTreeView>

我的.cs:

 protected void Page_Load(object sender, EventArgs e)
{
if (Session["emp_num"] != null && !string.IsNullOrEmpty(Session["emp_num"].ToString()))
{

if (!Page.IsPostBack)
{

LoadRootNodes(rtv_cm, TreeNodeExpandMode.ServerSide);
}
}
else
{
Response.Redirect("Frm_login.aspx");
}
}

protected void rtv_cm_NodeClick(object sender, RadTreeNodeEventArgs e)
{
dt_childs = (DataTable)Session["dt_childs"];
IEnumerable<DataRow> result = from myRow in dt_childs.AsEnumerable()
where myRow.Field<string>("task_id").TrimEnd() == e.Node.Value.TrimEnd()
select myRow;
if (result != null)
{
if (!string.IsNullOrEmpty(result.ElementAtOrDefault(0).Field<string>("page_name")))
{
Response.Redirect(result.ElementAtOrDefault(0).Field<string>("page_name").TrimEnd(), false);
}
}
}

我如何获得菜单:

  private void LoadRootNodes(RadTreeView treeView, TreeNodeExpandMode expandMode)
{
dt = Menu_db.GetMenu(Session["emp_num"].ToString(), CMSession.Current.db_code);
IEnumerable<DataRow> result = from myRow in dt.AsEnumerable()
where myRow.Field<string>("task_id").TrimEnd() == "0"
select myRow;
if (result != null && result.Count()>0)
{
DataTable dt_roots = result.CopyToDataTable<DataRow>();
Session["dt"] = dt;
Session["dt_roots"] = dt_roots;

foreach (DataRow row in dt_roots.Rows)
{
RadTreeNode node = new RadTreeNode();

node.Text = row["task_name"].ToString().TrimEnd();
node.Value = row["task_id"].ToString().TrimEnd();
if (Convert.ToInt32(row["count"]) > 0)
{
node.ExpandMode = expandMode;
}
treeView.Nodes.Add(node);
}
}
}

最佳答案

HTTP 就是所谓的“stateless protocol”。基本上,就好像服务器患有严重的阿尔茨海默氏病(没有不尊重的意思)。服务器回答了您的查询,但随后忘记了您曾经在那里。

当 HTTP 主要用于获取静态文档时,这不会造成任何问题,但 Web 应用程序需要某种状态。实现这一点的方法有很多,但 ASP.NET 通常会大量使用“ViewState”。 View 状态只是一个<input type="hidden">。包含 base-64 格式字节码的标签。 (如果您在浏览器中查看呈现的 HTML 页面的源代码,您会看到它 - 名为“__VIEWSTATE”)。当用户重新提交表单(通过单击按钮等)时, View 状态数据将发送回服务器。基本上,这就像提醒服务器上次它告诉您的内容。这就是 TextBoxes 和 GridViews 如何能够在回发之间看似保持它们的状态 - 它们将它们的状态存储在“viewstate”中。

不过, View 状态的问题在于它很容易丢失。您必须提交表单,否则 View 状态将不会保留。如果您使用 anchor 标记或 Request.Redirect ,您正在绕过表单并自行点击网页,并且在此过程中,您没有传递任何 View 状态。

通常没有办法避免这种情况,因此还有其他方法来存储应用程序的状态。但是,与 View 状态不同,这是您必须为每个要保留的值手动执行的操作。您可以将数据存储在 cookie 中,也可以将数据存储在服务器上(使用 Server["key"]Session["key"] ),或者您可以将数据保存在更具体的内容中,例如数据库或文本文件。但是,所有这些都必须手动完成,然后您必须在重新加载页面时重新加载数据。

在您的情况下,您可能想根据当前页面猜测选择了哪个项目(因为 TreeView 项目和页面似乎是链接的)并明确设置所选项目。如果这不可行,您可以尝试将所选项目存储在 Session 中。 , 使用类似 Session["Master_SelectedTreeViewItem"] = treeViewItem.Id; 的东西.然后,在 Page_Load , 得到这个值(小心,可能是 null ),然后设置相应的 treeview item 为选中状态。

我会发布更多代码示例,但您没有提供加载 TreeView 等的代码,因此很难做到。

更多信息

ASP.NET State Management Overview (MSDN)

关于c# - 如何通过回发维护 TreeView 用户交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com