2012-01-19 5 views
1

壊れていない7zip arhiveをチェックするアプリケーションがあります。リストボックスにすべてのアクションを書きたいのですが、問題はリストボックスがそれはフィニッシュで更新し、私はプロパティ.StartUpdateを(使用している場合でも、私の行動の終了時にすべての項目を置き、それに項目を追加)とEndUpdateの()すぐにリストボックスを更新する

これは私のコードの一部です:

foreach (string director in foldere) 
{ 
    if (director.ToLower().Contains("cluj") || director.ToLower().Contains("craiova") || director.ToLower().Contains("timisoara")) 
    { 
     String[] zipFile = Directory.GetFiles(director, "*.7z"); 
     foreach (string zip7 in zipFile) 
     { 
      //check arhive 
      SevenZipExtractor zipfile = new SevenZipExtractor(zip7); 
      if (zipfile.Check()) 
      { 
       String[] fisFaraArhiva = Directory.GetFiles(director, "*.*"); 
       foreach (string fisere in fisFaraArhiva) 
       { 
        if (fisere != zip7) 
        { 
         File.Delete(fisere); 
        } 
       } 
       listBox1.Items.Insert(0, "A fost sters fisierele din directorul " + director); 
       string[] fisComanda = Directory.GetFiles(utilizator, "*" + id + "*"); 
       foreach (string cmd in fisComanda) 
       { 
        File.Move(cmd, Path.Combine(director, Path.GetFileName(cmd))); 
        listBox1.BeginUpdate(); 
        listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director"); 
        listBox1.EndUpdate(); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Arhiva nu este ok"); 
       listBox1.BeginUpdate(); 
       listBox1.Items.Insert(0, "Arhiva " + zip7 + " NU este OK"); 
       listBox1.BackColor = Color.Red; 
       listBox1.EndUpdate(); 
      } 
     } 
    } 
} 
if (listBox1.BackColor != Color.Red) 
{ 
    listBox1.BeginUpdate(); 
    listBox1.BackColor = Color.Green; 
    listBox1.EndUpdate(); 
} 

答えて

4

は、アイテムを挿入した後listBox1.Update()を呼び出してみてください。

listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director"); 
listBox1.Update(); 
+0

thaksを行います! – XandrUu

5

問題は、UIスレッドがそれを行う時間があるのにUIスレッドを要求しているときにユーザーインターフェイスが更新されることです。それを解決する方法は2つあります。

  1. 利用listBox1.Update()処理を行うためにバックグラウンドスレッド(BackgroundWorkerの)を使用し、UIの更新または
  2. を強制すると、それがその進捗状況を報告していますUIスレッド。
3

リストに何かを挿入したら、リストのUpdate()に電話してください。これにより更新が強制されます。

ので、代わりの

listBox1.BeginUpdate(); 
listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director"); 
listBox1.EndUpdate(); 

は非常に、非常に多くの

listBox1.Items.Insert(0, "A fost mutata comanda " + Path.GetFileName(cmd) + " in director"); 
listBox1.Update(); 
関連する問題