ListBox не обновляется - PullRequest
       2

ListBox не обновляется

0 голосов
/ 29 декабря 2011

У меня есть форма с двумя ListBoxes на них. У меня есть removeFromBoxWaitin g, который следит за созданием новых файлов в каталоге.
Как только файл создан, он распечатывает его, а затем добавляет имя файла в список.
Моя проблема в том, что список не обновляется. Элементы на самом деле были добавлены, но они не отображаются, и я попробовал update(), но это не сработало. Так что любые советы будут оценены. Заранее спасибо.

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 ]

0 голосов
/ 29 декабря 2011

Вы можете попробовать следующий код:

listBox.Dispatcher.Invoke(ew Action(()=>listBox.Item.Add(item))
0 голосов
/ 29 декабря 2011

Я считаю, что ваша проблема в том, что вы пытаетесь добавить / удалить элементы списка во время итерации цикла (и оба эти действия происходят в потоке пользовательского интерфейса).Вы должны переместить ваш цикл for в отдельный поток, и ваш метод addToBoxWaiting будет выглядеть следующим образом:

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

Edit. Добавлен код потока.

    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;
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...