更新:最后的解决方案
我有一个 Winform,label1 将使用从条码扫描器通过txtBoxCatchScanner
.
场景是人们在通过接待处时在扫描仪下刷他们的 MemberID 卡,Winform 自动在该 MemberID 上进行搜索并返回他们的信息,例如在接待员的 PC 上返回他们的信息,其中 winForm 在她的一角桌面。
我的以下代码在第一次滑动时工作正常(例如第一人称)
数字 MemberID,例如 00888 出现在文本框中,ADO.NET 从 SQL 中提取数据并正常显示。
可能需要注意的一件事,光标在 memberID 的末尾:00888|
到目前为止一切顺利,然后:
当滑动 2(例如下一个人)发生时
他们的数字(比如,00999)被放在 txtBox 中第一个的末尾,例如:0088800999 所以当 TextChanged 触发时,它自然会搜索 0088800999 而不是 00999 ....
我试过了:
txtBoxCatchScanner.Clear();
和
txtBoxCatchScanner.Text = "";
并重新加载表格
在我的代码末尾“刷新”文本框
但我猜他们会触发 TextChanged 事件
在上一次滑动完成后,我如何重新聚焦或...清除旧数字和光标回到 txtBox 的开头...
我是初学者,所以我确定下面的代码很垃圾......
但是,如果有人有时间,请让我知道如何修复它以做我想做的事。
更新:
好的,经过多次试验,我现在已经设法让这 1/2 工作了,希望有更多经验的人可以帮助我完成!:P
if (txtBoxCatchScanner.Text.Length == 5)
{
label1.Text = txtBoxCatchScanner.Text; // just a label for testing .. shows the memmber ID
txtBoxCatchScanner.Select(0, 5);
}
所以扫描 1,说 00888 ,然后突出显示,扫描 2 ,说 00997 ......甜!覆盖(不附加到)00888 并做到这一点...扫描 2 0011289 ... DOH!
问题:并非所有条形码都是 5 位数字!!它们是随机长度!!会员 ID 范围从 2 位(例如 25)到 10 位,未来还会增长...
编辑:我发现条形码被读取为单独的按键。我认为这就是为什么下面的答案 1 不起作用,而大问题是:
例如,对于 00675,来自扫描仪的输入(?输出)是:
Down: Do Up: Do Down: Do Up: Do Down: D6 Up: D6 Down: D7 Up: D7 Down: D5 Up: D5 down: Retunn Up: Return
其他信息:条码扫描器是:Opticon OPL6845 USB
谢谢
private void txtBoxCatchScanner_TextChanged(object sender, EventArgs e)
{
Member member = new Member();
member.FirstName = "";
member.LastName = "";
//Get BarCode
//VALIDATE: Is a Number
double numTest = 0;
if (Double.TryParse(txtBoxCatchScanner.Text, out numTest))
{
//IS A NUMBER
member.MemberID = Convert.ToInt32(txtBoxCatchScanner.Text);
//SEARCH
//Search Member by MemberID (barcode)
List<Member> searchMembers = Search.SearchForMember(member);
if (searchMembers.Count == 0)
{
lblAlert.Text = "No Member Found";
}
else
{
foreach (Member mem in searchMembers)
{
lblMemberStatus.Text = mem.MemberStatus;
lblMemberName.Text = mem.FirstName + " " + mem.LastName;
lblMemberID.Text = mem.MemberID.ToString();
lblMessages.Text = mem.Notes;
if (mem.MemberStatus == "OVERDUE") // OR .. OR .. OR ...
{
lblAlert.Visible = true;
lblAlert.Text = "!! OVERDUE !!";
//PLAY SIREN aLERT SOUND
//C:\\WORKTEMP\\siren.wav
SoundPlayer simpleSound =
new SoundPlayer(@"C:\\WORKTEMP\\siren.wav");
simpleSound.Play();
}
else
{
lblAlert.Visible = true;
lblAlert.Text = mem.MemberStatus;
}
}
}
}
else
{
//IS NOT A NUMBER
lblAlert.Text = "INVALID - NOT A NUMBER";
////
//lblMemberName.Text = "";
//lblMemberID.Text = "";
//lblMemberID.Text = "";
}
解决方案:
系统不会让我再过 3 个小时回答我自己的问题,因为我是新手,只有 1 个帖子,所以会放在这里:
首先感谢大家的帮助和耐心。
我终于想出了一个解决方案,尚未在凌晨 2 点和就寝时间进行全面测试。
从我的更新开始,我取得了成功,但遇到了 MemberID 问题的可变长度。我现在用下面的代码克服了这个问题:
namespace SCAN_TESTING
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void txtBoxCatchScanner_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyValue == (char)Keys.Return)
{
e.Handled = true;
int barcodeLength = txtBoxCatchScanner.TextLength;
txtBoxCatchScanner.Select(0, barcodeLength);
//TEST
label3.Text = barcodeLength.ToString();
//TEST
label2.Text = txtBoxCatchScanner.Text;
}
}
我将把它添加到我之前的“真实”代码中并在早上进行测试但是在这个阶段正在做我想要的!=]
更新:测试它..完全符合需要:
private void txtBoxCatchScanner_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyValue == (char)Keys.Return)
{
e.Handled = true;
int barcodeLength = txtBoxCatchScanner.TextLength;
txtBoxCatchScanner.Select(0, barcodeLength);
//
//INSERT ORGINAL CODE HERE. No Changes were needed.
//
}//end of if e.KeyValue ...
}//end txtBoxCatchScanner_KeyUp
希望对以后的人有帮助!!:)
再次感谢 2 个非常好的解决方案,我可以看到它们是如何工作的,并且学到了很多东西。只是在我的情况下不起作用 - 更可能是由于我自己或我的错误/不理解,或扫描仪类型。