更新:解决方案在结尾
我有一个Winform,label1将显示从SQL搜索返回的一些信息,使用通过txtBoxCatchScanner
接收到的输入(MemberID)来扫描条形码。
情景是人们在通过接待处时在扫描仪下刷自己的MemberID卡,Winform会自动搜索该MemberID并返回他们的信息,包括例如“过期会员资格”等,这些信息会显示在接待员的桌面上的winForm的角落里。
我已经在第一次刷卡(例如第一个人)时成功运行了以下代码:
例如00888这个MemberID号码出现在文本框中,ADO.NET从SQL中提取数据并正常显示。
需要注意的一件事是,光标位于memberID的末尾:00888|
到目前为止都很好,然后:
当发生第二次刷卡(例如下一个人)时
他们的号码(比如00999)被放置在第一个号码的末尾,例如: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);
}
扫描第一张条形码,编号为00888,然后被突出显示。扫描第二个条形码,编号为00997……很好!覆盖(而不是追加)00888并完成其工作……扫描第二个条形码0011289…糟糕!!
问题:并非所有条形码都是5位数字!它们的长度是随机的!会员ID范围从2位数字(例如25)到10位数字,并且将来可能会增长......
编辑:我发现的问题是,条形码被读作单独的按键输入。我认为这就是下面答案1无法解决的原因,并且是大问题:
例如00675,来自扫描仪的输入(输出)为:
按下:Do 松开:Do 按下:Do 松开:Do 按下:D6 松开:D6 按下:D7 松开:D7 按下:D5 松开:D5 按下:返回 松开:返回
其他信息:条形码扫描仪为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
希望这能帮助未来的任何人!! :)
再次感谢提供的两个非常好的解决方案,我可以看到它们是如何工作的,并学到了很多。只是在我的情况下没有起作用——更可能是由于我自己或我的错误/不理解,或者扫描仪类型等原因。