2

ここでの私の目標は次のとおりです。

  • ユーザーはコンボボックスにコンピュータ名の全部または一部を入力します
  • ボタン クリック イベントはバックグラウンド ワーカーを開始し、コンピュータ名を DoWork メソッドに渡します
  • DoWork メソッドは ActiveDirectory で computername を検索し、コレクションを WorkerCompleted メソッドに渡します
  • WorkerCompleted メソッドは、各コンピューター名をコンボボックス項目に追加します。

私のエラーは、backgroundWorker_RunWorkerCompleted メソッドの foreach ループにあります。

  • 「'オブジェクト' には 'GetEnumerator' のパブリック定義が含まれていないため、foreach ステートメントはタイプ 'オブジェクト' の変数を操作できません」

MessageBox.Show(results.First().ToString()); を実行すると DoWork メソッドでは、コレクション内の最初のコンピューター名を表示できます。

MessageBox.Show(e.Result.ToString()); を実行すると DoWork および WorkerCompleted メソッドでは、次のようになります。

  • "System.DirectoryServices.AccountManagement.PrincipalSearchResult`1[System.DirectoryServices.AccountManagement.Principal]"

これに関するガイダンスをいただければ幸いです。

    private void button1_Click(object sender, EventArgs e)
    {
        //Saves computername entered by user to pass into DoWork method
        string PCName = comboBox1.Text;

        //Start background thread passing computer to the Dowork method
        backgroundWorker1.RunWorkerAsync(PCName);
    }
   
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {                 
        using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
        {
            //Setup Filter
            ComputerPrincipal computer = new ComputerPrincipal(ctx);
            computer.Name = "*" + e.Argument + "*";

            //Search for PC
            PrincipalSearcher ps = new PrincipalSearcher();
            ps.QueryFilter = computer;

            //Get Results
            PrincipalSearchResult<Principal> results = ps.FindAll();
                 
            //results will be passed to RunWorkerCompleted
            e.Result = results;                
        }
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        //Add each computername to combobox
        foreach (object PC in e.Result) // <--------------- ERROR HERE!
        {
            comboBox1.Items.Add(PC.ToString());
        }                            
    }
}
4

2 に答える 2

1

オブジェクトを IEnumerable または既知の型にキャストする必要があります

  var collection = (PrincipalSearchResult<Principal>) e.Result;
  foreach (var PC in collection) 
    {
        comboBox1.Items.Add(PC.ToString());
    }     
于 2013-08-07T18:22:31.793 に答える