C# 如何在backgroundworker C中填充treeview#

C# 如何在backgroundworker C中填充treeview#,c#,treeview,backgroundworker,populate,C#,Treeview,Backgroundworker,Populate,下面的代码使用JSONnet将JSON文件中的数据填充到名为treeView1的树视图中。如果我打开一个大的json文件,UI会在填充过程中挂起,那么我如何让backgroundworker中的所有事情都发生并显示一个用于填充进度的进度条呢?谢谢 private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog()

下面的代码使用JSONnet将JSON文件中的数据填充到名为treeView1的树视图中。如果我打开一个大的json文件,UI会在填充过程中挂起,那么我如何让backgroundworker中的所有事情都发生并显示一个用于填充进度的进度条呢?谢谢

    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.InitialDirectory = "c:\\";
        openFileDialog1.Filter = "All files (*.*)|*.*";
        openFileDialog1.FilterIndex = 1;
        openFileDialog1.RestoreDirectory = true;
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            string jsonfile = File.ReadAllText(openFileDialog1.FileName);                
            try
            {
                var jsondata = JObject.Parse(jsonfile);
                treeView1.Nodes.Clear();
                AddObjectNodes(jsondata, "DATA", treeView1.Nodes);
            }
            catch (Exception)
            {
                MessageBox.Show("Invalid JSON");                    
            }
        }
    }
    private void AddObjectNodes(JObject @object, string name, TreeNodeCollection parent)
    {
        var node = new TreeNode(name);
        parent.Add(node);

        foreach (var property in @object.Properties())
        {
            AddTokenNodes(property.Value, property.Name, node.Nodes);
        }
    }

    private void AddArrayNodes(JArray array, string name, TreeNodeCollection parent)
    {
        var node = new TreeNode(name);
        parent.Add(node);

        for (var i = 0; i < array.Count; i++)
        {
            AddTokenNodes(array[i], string.Format("[{0}]", i), node.Nodes);
        }
    }

    private void AddTokenNodes(JToken token, string name, TreeNodeCollection parent)
    {
        if (token is JValue)
        {
            parent.Add(new TreeNode(string.Format("{0}: {1}", name, ((JValue)token).Value)));
        }
        else if (token is JArray)
        {
            AddArrayNodes((JArray)token, name, parent);
        }
        else if (token is JObject)
        {
            AddObjectNodes((JObject)token, name, parent);
        }
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
OpenFileDialog openFileDialog1=新建OpenFileDialog();
openFileDialog1.InitialDirectory=“c:\\”;
openFileDialog1.Filter=“所有文件(*.*)|*.*”;
openFileDialog1.FilterIndex=1;
openFileDialog1.RestoreDirectory=true;
如果(openFileDialog1.ShowDialog()==DialogResult.OK)
{
字符串jsonfile=File.ReadAllText(openFileDialog1.FileName);
尝试
{
var jsondata=JObject.Parse(jsonfile);
treeView1.Nodes.Clear();
AddObjectNodes(jsondata,“DATA”,treeView1.Nodes);
}
捕获(例外)
{
Show(“无效的JSON”);
}
}
}
私有void AddObjectNodes(JObject@object,字符串名,TreeNodeCollection父节点)
{
var节点=新树节点(名称);
添加(节点);
foreach(@object.Properties()中的var属性)
{
AddTokenNodes(property.Value、property.Name、node.Nodes);
}
}
私有void AddArrayNodes(JArray数组、字符串名称、TreeNodeCollection父级)
{
var节点=新树节点(名称);
添加(节点);
对于(var i=0;i
在这里询问之前,您是否搜索过?非常确定这是一个非常常见的问题…所以你提到了BackgroundWorker…对它做一些研究,以及如何使用它…其他选项是System.Threading.Thread或System.Threading.Task。另外请记住,如果要从BackgroupWorker/Thread/Task中更新TreeView,则需要调用控件,例如TreeView。在向树中添加节点的每个循环之前和之后,也要应用BeginUpdate和EndUpdate方法,以加快更新速度。@SuperOli,如果没有人发布这样的帖子,你怎么能指望谷歌能获得搜索信息呢?