Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在填充大型树视图时使用ProgressBar_C#_Process_Treeview_Load_Progress Bar - Fatal编程技术网

C# 在填充大型树视图时使用ProgressBar

C# 在填充大型树视图时使用ProgressBar,c#,process,treeview,load,progress-bar,C#,Process,Treeview,Load,Progress Bar,我正在用大量数据填充一个treeview,通常程序需要一段时间才能将控件返回给用户(我想这只是treeview方面的过程太多了)。所以我决定提供一个进度条,向用户显示一切进展顺利 在此树视图中,我选择了一个文件夹,该文件夹中的所有xml文件将添加到此文件夹,树视图如下所示: + FOLDER NAME 1 |__xml file name 1 |__xml file name 2 +FOLDER NAME 2 |__xml file name 1 |__xml file name 2 所以问题

我正在用大量数据填充一个treeview,通常程序需要一段时间才能将控件返回给用户(我想这只是treeview方面的过程太多了)。所以我决定提供一个进度条,向用户显示一切进展顺利

在此树视图中,我选择了一个文件夹,该文件夹中的所有xml文件将添加到此文件夹,树视图如下所示:

+ FOLDER NAME 1
|__xml file name 1
|__xml file name 2
+FOLDER NAME 2
|__xml file name 1
|__xml file name 2
所以问题是,我的progressbar的完成速度实际上比treeview本身要快得多,我认为Program使treeview可见的时间是必须的。我该怎么做

这是我浏览文件夹并将其传递给函数以填充treeview的代码(抱歉,taht太长了,但我认为这会让它更清楚),正如您所看到的,我希望在向treeview添加节点时,此部分和其他50%的进度条被填充:

        private void toolStripBrowseDirectory_Click(object sender, EventArgs e)
    {
        //Reset progressbar
        toolStripProgressBar.Value = 0;

        folderBrowser.ShowNewFolderButton = false;
        DialogResult result = folderBrowser.ShowDialog();

        int countAllfiles = 0;
        int countGoodFiles = 0;

        if (result == DialogResult.OK)
        {
            toolStripProgressBar.Value = 0;

            string selectedFolder = folderBrowser.SelectedPath;
            string[] files = Directory.GetFiles(selectedFolder, "*.xml", SearchOption.AllDirectories);
            List<string> goodFiles = new List<string>();

            toolStripProgressBar.Maximum = files.Length;

            countAllfiles = files.GetLength(0);

            //Folder name
            FileInfo folderInfo = new FileInfo(selectedFolder);
            string folderName = folderInfo.Name;

            if (countAllfiles != 0)
            {
                foreach (string file in files)
                {
                    //file name
                    FileInfo fileInfo = new FileInfo(file);
                    string fileName = fileInfo.Name;

                    try
                    {
                        XmlDocument checkFileType = new XmlDocument();
                        checkFileType.Load(file);

                        if (checkFileType.SelectSingleNode("//Document/@Type").Value == "Test Results")
                        {
                            countGoodFiles++;
                            goodFiles.Add(file);
                        }
                    }
                    catch (Exception a)
                    {
                        StartForm.setDebug("Comparison Mode", a.Message, 21, "Can not read Selected XML file '" + fileName + "'", "Check file for compatibilyty", "File was excluded from list");
                    }

                    this.toolStripProgressBar.PerformStep();
                }

                if (countGoodFiles == 0)
                {
                    MessageBox.Show("There are no compatible XML files (exported from ZTR files) in '" + folderName + "'", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    StartForm.setDebug("Comparison Mode", "N/A", 20, "There are no compatible XML files (exported from ZTR files) in '" + folderName + "'", "Select a folder that contains compatible files!", "No file has been added to Select File Tree");
                    toolStripProgressBar.Value = 100;
                }
                else if (countGoodFiles > 0)
                {
                    this.Cursor = Cursors.WaitCursor;

                    AddFilesToTree(folderName, goodFiles.ToArray());

                    this.Cursor = Cursors.Default;
                }
            }
            else
            {
                MessageBox.Show("There are no XML files in '" + folderName + "'", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);                    
            }
        }           
    }
那么,如何以正确的方式做到这一点呢

更新: **解决** 我发现了这个问题,我必须在使用函数向treeview添加节点之前完成这一行

                        toolStripProgressBar.Maximum += countGoodFiles;

                    AddFilesToTree(folderName, goodFiles.ToArray());
修复了进度条的最大值
仍然在TreeView开始加载之前完成进度条(最大化)…

如果您只是偶尔调用
Application.DoEvents()
,则可以跳过进度条,它将显示随节点扩展的树状视图,并且应该与用户相关,以了解他们需要等待多长时间。

如果您只是偶尔调用
Application.DoEvents()
,您可以跳过进度条,它将显示随着节点扩展的TreeView,并且应该与用户相关,以了解他们需要等待多长时间。

可能使用marquee的进度条模式,它只是在进度条上来回移动,然后在加载完树后隐藏进度条?这样,您仍然可以看到应用程序正在做一些工作,用户可以知道等待吗


progressBar1.Style=ProgressBarStyle.Marquee

可能使用marquee的进度条模式,它只是在进度条上来回移动,然后在加载完树后隐藏进度条?这样,您仍然可以看到应用程序正在做一些工作,用户可以知道等待吗


progressBar1.Style=ProgressBarStyle.Marquee

更好的方法可能是根据需要填充树的分支;因此,当用户打开一个新分支时,只需获取子分支即可。在一次启动中填充整个树是浪费的,因为您的用户可能只对树的一小部分感兴趣,而不想等待整个内容加载,以便他们可以查看感兴趣的树的一小部分

更好的方法可能是根据需要填充树的分支;因此,当用户打开一个新分支时,只需获取子分支即可。在一次启动中填充整个树是浪费的,因为您的用户可能只对树的一小部分感兴趣,而不想等待整个内容加载,以便他们可以查看感兴趣的树的一小部分

       int progressSteps = (files.Length / 100)/2;
这很神秘,但我确实不明白其中的逻辑。代码很难阅读,您应该将其分解并使用更多的帮助器方法。请尝试以下方法:

        toolStripProgressBar.Maximum = files.Length;
这很神秘,但我确实不明白其中的逻辑。代码很难阅读,您应该将其分解并使用更多的帮助器方法。请尝试以下方法:

        toolStripProgressBar.Maximum = files.Length;

检查toolStripProgressBar.Maximum的值。流程完成时,它是否等于ProgressBar的值


如果ProgressBar的Step属性为1,则它应等于要在ProgressBar上显示的步骤数。可能是toolStripProgressBar.Maximum设置得太高,因此它永远不会在流程完成之前到达终点。

检查toolStripProgressBar.Maximum的值。流程完成时,它是否等于ProgressBar的值


如果ProgressBar的Step属性为1,则它应等于要在ProgressBar上显示的步骤数。可能是toolStripProgressBar。最大值设置得太高,因此它永远不会在流程完成之前到达终点。

请查看BackgroundWorker。它允许您从一个单独的踏板填充treeview,从而使您的用户界面更具响应性。它还支持报告进度,因此如果您仍然希望显示进度条,则完全有可能



看看幕后工作人员。它允许您从一个单独的踏板填充treeview,从而使您的用户界面更具响应性。它还支持报告进度,因此如果您仍然希望显示进度条,则完全有可能



@B泰勒井在这种情况下是必要的:(@B泰勒井在这种情况下是必要的:(当用户关闭窗口时崩溃并烧掉。不。不要这样做。这是偷工减料。正确的方法。@Hans你是什么意思?@Charles正确的方法是什么?我已经使用了这种技术,但我确实不介意学习一些新的东西。很简单,如果OP听从你的建议,那么当用户关闭时,他的程序就会崩溃。)代码运行时打开窗口。因为这不会使代码停止运行。当用户关闭窗口时,窗口会崩溃并烧掉。不。不要这样做。这是偷工减料。正确的方法。@Hans你是什么意思?@Charles正确的方法是什么?我已经使用了这种方法,但我确实不介意学习新的东西。它很有趣简单地说,如果OP遵循您的建议,那么当用户在代码运行时关闭窗口时,他的程序将崩溃。因为这不会使代码停止运行。哦,是的,谢谢,那是错误的,我更正了代码,但我的进度条仍然在实际运行之前完成