2011-12-29 18 views
0

私は2つのフォームListBoxesを持っています。私はremoveFromBoxWaitin gディレクトリに新しいファイルの作成を監視している。
ファイルが作成されると、ファイルが印刷されてから、ファイルの名前がリストボックスに追加されます。
私の問題は、リストボックスが更新されないということです。実際にアイテムが追加されましたが、表示されず、私もupdate()を試しましたが、うまくいかなかったのです。だから、どんなヒントも高く評価されます。前もって感謝します。ListBoxが更新されない

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.IO; 
using System.Text; 
using System.Windows.Forms; 
using DevExpress.XtraBars; 
using System.Threading; 
using System.Configuration; 

namespace PrntToKitchen 
{ 
public partial class PrintFiles : DevExpress.XtraBars.Ribbon.RibbonForm 
{ 
    FileSystemWatcher filesWatcher = new FileSystemWatcher(); 

    public void barButtonItem1_ItemClick(object sender, ItemClickEventArgs e) 
    {   
     MessageBox.Show(e.Item.Name); 
     if (Properties.Settings.Default[e.Item.Name + "Read"].ToString().Length > 1 && Properties.Settings.Default[e.Item.Name + "ExtIn"].ToString().Length > 1) 
     { 
      filesWatcher.Path = Properties.Settings.Default[e.Item.Name + "Read"].ToString(); 
      filesWatcher.Created += new System.IO.FileSystemEventHandler(eventG); 
      //filesWatcher.Deleted += new System.IO.FileSystemEventHandler(addToBoxFinished); 
      filesWatcher.EnableRaisingEvents = true;      
     } 
    } 

    public void eventG(object sender, FileSystemEventArgs e) 
    { 
     string CurrentPrinter = ""; 
     string findPrt = e.FullPath.Substring(0, e.FullPath.Length-(e.Name.Length + 1)); 
     string findPrtExt = e.Name.Substring(e.Name.LastIndexOf(".")); 

     for (int i = 1; i <= Properties.Settings.Default.NumberOfPrinters; i++) 
     { 
      string testPrt = Properties.Settings.Default["Printer" + i + "Read"].ToString(); 
      string testExt = Properties.Settings.Default["Printer" + i + "ExtIn"].ToString(); 

      if (testPrt == findPrt && testExt == findPrtExt) 
      { 
       CurrentPrinter = "Printer" + i.ToString(); 
       POSPrinter printer = new POSPrinter(Properties.Settings.Default["Printer" + i + "Port"].ToString(), (int)Properties.Settings.Default["Printer" + i + "Speed"]); 
       addToBoxWaiting(e.FullPath.ToString()); 
       string file = e.FullPath; 
       printer.BeginPrint(); 
       printer.PrintFile(file); 
       printer.EndPrint(); 
       printer.Dispose(); 
       if ((bool)Properties.Settings.Default[CurrentPrinter + "Delete"]) 
       { 
        IsFileLocked(file); 
        System.IO.File.Delete(file); 
       } 
       else 
       { 
        System.IO.File.Move(file, Properties.Settings.Default[CurrentPrinter + "Store"] + "\\" + e.Name + Properties.Settings.Default[CurrentPrinter + "ExtOut"]); 
       } 
       removeFromBoxWaiting(e.FullPath.ToString()); 
       addToBoxFinished(e.FullPath.ToString()); 
       busy = false; 
       break; 
      } 
     } 
    } 

    void addToBoxWaiting(string text) 
    { 
     listBox1.Items.Add(text); 

    } 

    void removeFromBoxWaiting(string text) 
    { 
     listBox1.Items.Remove(text); 
    } 

    public void addToBoxFinished(string destination) 
    { 
     listBox2.Items.Add(destination); 

    } 

} 

}

+2

@yordan質問関連ではありませんすべてのコードを削除することが可能ですか? – Adam

+0

すみません。今すぐやります。 – Jordan

+0

あなたはこのバーテイテムをクリックしますか?イベントが起動しますか? – King

答えて

0

私はあなたの問題はあなたがループを反復しながら、リストボックスの項目を追加/削除しようとしている(と両方このアクションは、UIスレッド上で起こっている)ということであると信じています。あなたは別のスレッドにあなたのforループを移動しなければならない、とあなたのaddToBoxWaiting方法は、次のようになります。

private void AddToListBox(string item) 
{ 
    MethodInvoker del = delegate 
    { 
     listBox1.Items.Add(item); 
    }; 
    BeginInvoke(del); 
} 

編集。スレッドコードが追加されました。

public void eventG(object sender, FileSystemEventArgs e) 
    { 
     Thread eventThread = new Thread(ThreadProcEventG); 
     eventThread.Start(e); 
    } 

    private void ThreadProcEventG(object eventArgs) 
    { 
     var e = (FileSystemEventArgs)eventArgs; 
     string CurrentPrinter = ""; 
     string findPrt = e.FullPath.Substring(0, e.FullPath.Length-(e.Name.Length + 1)); 
     string findPrtExt = e.Name.Substring(e.Name.LastIndexOf(".")); 

     for (int i = 1; i <= Properties.Settings.Default.NumberOfPrinters; i++) 
     { 
      string testPrt = Properties.Settings.Default["Printer" + i + "Read"].ToString(); 
      string testExt = Properties.Settings.Default["Printer" + i + "ExtIn"].ToString(); 

      if (testPrt == findPrt && testExt == findPrtExt) 
      { 
       CurrentPrinter = "Printer" + i.ToString(); 
       POSPrinter printer = new POSPrinter(Properties.Settings.Default["Printer" + i + "Port"].ToString(), (int)Properties.Settings.Default["Printer" + i + "Speed"]); 
       addToBoxWaiting(e.FullPath.ToString()); 
       string file = e.FullPath; 
       printer.BeginPrint(); 
       printer.PrintFile(file); 
       printer.EndPrint(); 
       printer.Dispose(); 
       if ((bool)Properties.Settings.Default[CurrentPrinter + "Delete"]) 
       { 
        IsFileLocked(file); 
        System.IO.File.Delete(file); 
       } 
       else 
       { 
        System.IO.File.Move(file, Properties.Settings.Default[CurrentPrinter + "Store"] + "\\" + e.Name + Properties.Settings.Default[CurrentPrinter + "ExtOut"]); 
       } 
       removeFromBoxWaiting(e.FullPath.ToString()); 
       addToBoxFinished(e.FullPath.ToString()); 
       busy = false; 
       break; 
      } 
     } 
    } 
+0

IIRCの場合、FileSystemWatcherイベントはUIスレッドとは異なるスレッドで発生します。したがって、別のスレッドを開始する必要はありません。 Invoke()/ BeginInvoke()でUI更新をラップするだけで正常に動作します。 –

0

次のコード試みることがあります。

listBox.Dispatcher.Invoke(ew Action(()=>listBox.Item.Add(item)) 
関連する問題