2014-12-03 74 views
0

我写了一个非常简单的c#应用程序,它扫描我们的活动目录以锁定帐户并将用户名返回到列表框(LB1)。这是搜索的代码。它属于Button_Click事件:Winforms使用PrincipalSearcher函数的进度条

  try 
     { 
      PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "DOMAIN", "OU=OUnAme,DC=DOMAIN,DC=com"); 

      UserPrincipal qbeUser = new UserPrincipal(ctx); 
      qbeUser.Enabled = true; 

      PrincipalSearcher search = new PrincipalSearcher(qbeUser);   

      foreach (UserPrincipal user in search.FindAll()) 
      { 
       if (user.IsAccountLockedOut()) 
       { 
        LB1.Items.Add(user.SamAccountName.ToString()); 
       } 
      } 
     } 

是否有一种方法来实现填充FindAll()事件的进度条?我只想先做一个计数函数,来确定进度条的最大值,然后在foreach循环的第一步添加一个incrament?

谢谢 韦斯

+2

没有时间给出一个很好的完整答案,但您可能想查看['BackgroundWorker'](http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker %28v = vs.110%29.aspx)组件,因此您可以在不阻止UI线程的情况下执行处理。还请记住[这个问题](http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c)详细说明如何更新UI线程从后台线程。 – Anthony 2014-12-03 19:04:23

回答

0

使用本

UserPrincipal []user_all = search.FindAll(); 
int max = user_all.length; 
progressBar1.Maximum = max; 
progressBar1.Step = 1; 
foreach (UserPrincipal user in user_all) 
{ 
    if (user.IsAccountLockedOut()) 
    { 
     LB1.Items.Add(user.SamAccountName.ToString()); 
    } 
    progressBar1.PerformStep(); 
} 
+2

是的,并在某些线程中执行此操作。 – 2014-12-03 19:12:48

+0

我看到的唯一问题是,它然后两次扫描AD。在那一点上,它使进度条无用,因为我可能只是在扫描最初的目的。 – Wes 2014-12-03 19:27:35

0

一般的工作流程,我会做在这种情况下,因为你不能从FindAll取得进展的反馈。

  • 让你的进度条显示空(没有进展填写)
  • 有一个状态,说:“聚会账户”(或任何你想要的)
  • 设置FindAll()结果一个局部变量,让你的计数。
  • 将进度条配置为计数加上一些任意数字来解释您刚刚做的查找。
  • 将进度增加到您制作的数量以显示其已完成
  • 现在开始循环并更新进度栏。

不要忘记在后台线程中这样做,所以你可以在同一时间工作并更新UI。