C# 列表框没有得到更新
我有一个表单,上面有两个C# 列表框没有得到更新,c#,winforms,listbox,C#,Winforms,Listbox,我有一个表单,上面有两个列表框。我已从BoxWaitin中删除了监视目录中新文件创建的g。 创建文件后,它会将其打印出来,然后将文件名添加到列表框中。 我的问题是列表框没有得到更新。实际上已经添加了项目,但它们没有显示,我也尝试了update(),但没有效果。因此,任何提示都将不胜感激。提前谢谢 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using
列表框
。我已从BoxWaitin中删除了监视目录中新文件创建的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);
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.IO;
使用系统文本;
使用System.Windows.Forms;
使用DevExpress.xtrabar;
使用系统线程;
使用系统配置;
名称空间PrntToKitchen
{
公共部分类打印文件:DevExpress.xtrabar.Ribbon.RibbonForm
{
FileSystemWatcher fileWatcher=新的FileSystemWatcher();
public void BarButtonim1_ItemClick(对象发送者,ItemClickEventArgs e)
{
MessageBox.Show(如Item.Name);
if(Properties.Settings.Default[e.Item.Name+“Read”].ToString().Length>1和&Properties.Settings.Default[e.Item.Name+“exe”].ToString().Length>1)
{
filewatcher.Path=Properties.Settings.Default[e.Item.Name+“Read”].ToString();
filewatcher.Created+=new System.IO.FileSystemEventHandler(eventG);
//filewatcher.Deleted+=new System.IO.FileSystemEventHandler(addToBoxFinished);
FileWatcher.EnableRaisingEvents=true;
}
}
public void事件(对象发送方、文件系统目标)
{
字符串CurrentPrinter=“”;
字符串findPrt=e.FullPath.Substring(0,e.FullPath.Length-(e.Name.Length+1));
字符串findPrtExt=e.Name.Substring(e.Name.LastIndexOf(“.”);
for(int i=1;i我认为您的问题在于,您试图在循环中添加/删除列表框项(这两个操作都发生在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;
}
}
}
public void事件(对象发送方、文件系统目标)
{
线程事件线程=新线程(ThreadProcEventG);
eventThread.Start(e);
}
私有void threadprocevent(对象事件参数)
{
var e=(FileSystemEventArgs)eventArgs;
字符串CurrentPrinter=“”;
字符串findPrt=e.FullPath.Substring(0,e.FullPath.Length-(e.Name.Length+1));
字符串findPrtExt=e.Name.Substring(e.Name.LastIndexOf(“.”);
对于(int i=1;i您可以尝试以下代码:
listBox.Dispatcher.Invoke(ew Action(()=>listBox.Item.Add(item))
@yordan是否可以删除所有与问题不相关的代码?是否单击了baritem,事件是否被触发?IIRC,FileSystemWatcher事件是在与UI线程不同的线程上触发的。因此,无需启动其他线程。只需将UI更新包装在Invoke()/BeginInvoke()中,即可正常工作。