【发布时间】:2014-05-30 23:20:46
【问题描述】:
我的程序的目标是将一个目录加载到我的树视图节点中,这需要 10 秒以上(因为该目录驻留在远程 PC 中)。在此期间,我将添加一个等待的弹出图像。我复制了这个帖子的答案:How can i show an image while my application is loading 到我的代码,比如:
private void treeView2_AfterSelect(object sender, TreeViewEventArgs e)
{
Form f = new Form();
f.Size = new Size(20, 25);
Image im = Image.FromFile(@"C:\Documents and Settings\JiangC\Documenti\Immagini\loader.gif");
f.FormBorderStyle = FormBorderStyle.None;
f.MinimizeBox = false;
f.MaximizeBox = false;
f.AutoSize = true;
PictureBox pb = new PictureBox();
//pb.Dock = DockStyle.Fill;
pb.SizeMode = PictureBoxSizeMode.AutoSize;
pb.Image = im;
pb.Location = new Point(50, 50);
f.Controls.Add(pb);
f.Show();
// Application.DoEvents();
BuildTree(directory, treeView2.Nodes, treeView2.SelectedNode);
f.Close();
}
我想要做的是在加载过程中(当 Buildtree() 方法正在实现时)带有图片框 pb 的表单 f 将被显示,并且在加载后它们就消失了。
第一个问题在“pb.Dock = DockStyle.Fill;”中
如果我取消注释,这个表单 f 将不会在加载过程中显示(但我可以在屏幕底部看到它的最小化窗口)。只有当我取消这条线时,表格 f 才能显示出来。
第二个问题是“f.Show();”当显示形式 f 时,完全不显示图片框 pb(只是一个空洞)。如果我将其修改为“f.ShowDialog();”,则可以显示带有图片的表格f。
然而,第三个问题来了,形式 f 将永远存在,我的函数“BuildTree();”根本没有实施!
第四个问题是如果我添加“Application.DoEvents();”行,它工作得很好,在加载过程中会显示带有图片框的表单 f,加载后 f 会消失,但 f 中的图片是gif,在这种情况下,gif 根本没有动画!
所以有人可以帮我解决这个问题吗?
这是我的 BuildTree 函数代码:
private void BuildTree(DirectoryInfo[] directoryInfo, TreeNodeCollection addInMe, TreeNode clicked)
{
for (int i = 0; i < directoryInfo.Length; i++)
{
var files = directoryInfo[i].GetFiles();
int length = files.Length;
clicked.Nodes.Add(directoryInfo[i].Name);
List<TreeNode> dateNode = new List<TreeNode>();
string[] allDates = new string[length];
try
{
for (int j = 0; j < length; j++)
{
allDates[j] = files[j].Name.Substring(11, 6);
}
}
catch (Exception e)
{ }
string[] date = allDates.Distinct().ToArray();
for (int k = 0; k < date.Length; k++) //From here to the end
{
// is my code loading file
dateNode.Add(clicked.Nodes.Add(date[i]));
for (int j = 0; j < length; j++)
{
// curNode.Nodes.Add(file.FullName, file.Name);
if (files[j].Name.Substring(11, 6) == date[i])
{
dateNode[i].Nodes.Add(files[j].FullName, files[j].Name);
}
}
}
foreach (DirectoryInfo subdir in directoryInfo[i].GetDirectories())
{
BuildTree(subdir, clicked.Nodes);
}
}
}
【问题讨论】:
-
为什么要动态构建表单?您可以创建一个普通表单并使用它。
-
嗯,我要添加的弹出图像是带有加载效果的gif,我认为这是合理的。