2011-12-29 2 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

+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)) 
관련 문제