2011-12-29 158 views
0

我有一个表格,其上有两个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 2011-12-29 12:07:43

+0

我很抱歉。我现在就做。 – Jordan 2011-12-29 12:09:01

+0

您是否点击了baritem,事件是否被激发? – King 2011-12-29 12:17:09

回答

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更新,它应该可以正常工作。 – 2011-12-29 12:43:34

0

你可以试试下面的代码:

listBox.Dispatcher.Invoke(ew Action(()=>listBox.Item.Add(item))