【问题标题】:In C# how can i keep my Treeview node selected upon refresh在 C# 中,如何在刷新时保持选中 Treeview 节点
【发布时间】:2014-06-14 15:25:21
【问题描述】:

我对编码真的很陌生 我有一个用计时器刷新的树视图。 如何确保每次刷新时都突出显示所选节点

感谢任何帮助 谢谢

这是我的代码:

    private void PopulateTree(ListObjectsResponse buckets)
    {
        treeView1.Nodes.Clear();
        List<TreeItem> items = new List<TreeItem>();
        foreach (S3Object obj in buckets.S3Objects)
        {
            treeView1.Nodes.Add(new TreeNode(obj.Key));
        }
    }

    private void button4_Click_1(object sender, EventArgs e)
    {
        timer1.Enabled = true;
        existingBucketName = label3.Text + "-DP";
        AmazonS3Client client = new AmazonS3Client();
        ListObjectsRequest listRequest = new ListObjectsRequest
        {
            BucketName = existingBucketName,
        };

        try
        {
            ListObjectsResponse listResponse;
            listResponse = client.ListObjects(listRequest);
            PopulateTree(listResponse);
        }
        catch
        {
            timer1.Enabled = false;
            MessageBox.Show("There is no folder for this user");
        }
    }

【问题讨论】:

  • 将选中节点存入局部变量,刷新,从变量中设置选中节点。

标签: c# treeview refresh selected treenode


【解决方案1】:

假设o.Key 是一个字符串,并且每个字符串是唯一的并且在buckets.S3Objects 中最多出现一次,请尝试在重新填充TreeView 之前保存选定的值,然后再次选择它。

private void PopulateTree(ListObjectsResponse buckets)
{
    // Since you're about to clear out all current TreeNode instances, storing a
    // reference to SelectedNode is not enough. You're setting o.Key as the Text
    // for each TreeNode, so save the selected node's Text value. 
    var selectedText
        = treeView1.SelectedNode == null ? "" : treeView1.SelectedNode.Text;

    // Repopulate your TreeView with new TreeNodes
    treeView1.Nodes.Clear();
    treeView1.Nodes.AddRange(buckets.S3Objects.Select(o => new TreeNode(o.Key)).ToArray())

    // Look for the TreeNode with the same Text that you had selected before.
    // If it's not found, then SelectedNode will be set to null
    treeView1.SelectedNode =
        = treeView1.Nodes.Cast<TreeNode>()
                         .SingleOrDefault(n => n.Text == selectedText);
}

上述几种方法,例如SelectCastSingleOrDefault,都是LINQ的一部分。

【讨论】:

  • 感谢您的快速响应。我输入了代码,看起来它不喜欢行 treeView1.Nodes.AddRange(buckets.S3Objects.Select(o => new TreeNode(o.Key))) - 正如我所说的我只是在这方面的新手希望我不只是犯了一个菜鸟错误
  • 如果我选择了子节点,这对我不起作用。最后一行似乎只搜索顶级节点。在调试器中,treeView1.Nodes 只是顶级的。有没有人有一种简洁的方法来搜索整个树以查找先前的选择?
  • 如果您在记住之前的选择时能够使用 SelectedNode.Name,那么您可以使用以下命令重新选择它,这将适用于子节点:treeView1.SelectedNode = treeView1.Nodes.Find(selectedText, searchAllChildren: true).FirstOrDefault();
【解决方案2】:

假设这是您正在谈论的 ASP.NET(不是 ASP.NET MVC),您可以在 Page_Load() 事件处理程序中执行此操作。一定要检查IsPostBack == true

例如,

private void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack)
  {
    // set selected node here
  }
}

如果您使用的是 ASP.NET MVC,那么只需将属性存储在 ViewBag 中即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多