2

更新:最後に解決策


私はWinformを持っています.label1は、バーコードスキャナーから受け取った入力(MemberID)を使用して、SQL検索から返された情報を表示しますtxtBoxCatchScanner

シナリオは、受信者が受付を通過する際に MemberID カードをスキャナーの下にスワイプし、Winform が自動的にその MemberID を検索し、受付係の PC の隅に winForm がある「期限切れのメンバーシップ」などの情報を返すことです。デスクトップ。

最初のスワイプで以下のコードが正常に機能しています(例:一人称)

テキスト ボックスに 00888 などの番号 MemberID が表示されると、ADO.NET は SQL からデータを取得し、正常に表示します。

カーソルが memberID: 00888| の末尾にあることに注意してください。

ここまでは順調です。次に:

スワイプ 2 (例: 次の人) が発生したとき

それらの番号 (たとえば、00999) は、txtBox の最初の末尾に配置されます。たとえば、0088800999 のように、TextChanged Fires が発生すると、00999 ではなく 0088800999 が検索されます ....

私はもう試した:

txtBoxCatchScanner.Clear();

txtBoxCatchScanner.Text = "";

フォームのリロード

コードの最後にテキストボックスを「更新」する

しかし、TextChangedイベントをトリガーすると思います

どうすれば焦点を合わせ直すか...前のスワイプが完了した後、古い番号をクリアしてカーソルをtxtBoxの先頭に戻すことができます...

私は初心者なので、以下のコードはかなりがらくただと確信しています....

しかし、誰か時間があれば、私がやりたいことを修正する方法を教えてください。

アップデート:

OK、多くの実験の後、この 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);
}

SO スキャン 1、たとえば 00888 、次にそれが強調表示され、スキャン 2 、たとえば 00997 ... 甘い! 00888 を上書き (追加ではありません) して実行します ... スキャン 2 0011289 ... DOH!!

問題: すべてのバーコードが 5 桁であるとは限りません!! 彼らはランダムな長さです!! メンバー ID は 2 桁 (例: 25) から 10 桁までの範囲であり、将来的には増加する予定です...

編集:私が発見したことは、バーコードが個々のキーの押下として読み取られるということです。これが、以下の回答1が機能しない理由であり、大きな問題があると思います:

たとえば、00675 の場合、スキャナからの入力 (?出力) は次のようになります。

ダウン: ドゥ アップ: ドゥ ダウン: ドゥ アップ: ドゥ ダウン: 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 = "";
    }

解決:

私は初心者で投稿が1つしかないため、システムは私自身の質問にさらに3時間答えることを許可しません。

まず、あなたの助けと忍耐に感謝します。

午前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 つの非常に優れたソリューションをありがとうございました。私の場合はうまくいきませんでした-おそらく私自身または私のエラー/理解できない、またはスキャナーのタイプが原因です。

4

3 に答える 3

3

実際の問題が何であるか正確にはわかりません。

txtBoxCatchScanner.Clear();
txtBoxCatchScanner.Text = "";

どちらも「Changed」イベントをトリガーします。しかし、彼らは箱もクリアします。それがあなたのやりたいことなのです。

ボックスが実際に空であるかどうかを最初に確認し、空の場合は戻ることができます。お気に入り:

if(txtBoxCatchScanner.Text == "" |txtBoxCatchScanner.Text == string.Empty)
return;

ボックスが空の場合、何も起こりません。

私があなたの問題を誤解している場合は、具体的に教えてください。

よろしく

編集:

次のような場合、関数は機能するはずです。

    private void txtBoxCatchScanner_TextChanged(object sender, EventArgs e)
{             
Member member = new Member();
member.FirstName = "";
member.LastName = "";            

if(txtBoxCatchScanner.Text == "" | txtBoxCatchScanner.Text == string.Empty)
return;    // Leave function if the box is empty

//Get BarCode
//VALIDATE: Is a Number           
int numTest = 0;
if (int.TryParse(txtBoxCatchScanner.Text, out numTest))
{
    //IS A NUMBER
    //member.MemberID = Convert.ToInt32(txtBoxCatchScanner.Text);
    member.MemberID = numTest; // you already converted to a number...
    //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 = "";
}
txtBoxCatchScanner.Clear();
}
于 2013-01-23T10:29:21.537 に答える
3

使用しているバーコード スキャナーは、HID (キーボード エミュレーション) として機能しているようです。私が知っているすべての単純なバーコード スキャナー (そして私は日常的に使用しています) には、スキャンしたバーコードの接尾辞を指定するオプションがあります。接尾辞を に変更しCRLF、デフォルトのボタンをフォームに追加します。で終わるバーコードをスキャンするCRLFと、自動的に「ボタンを押します」。

チェックを実行するコードをイベントからTextChangedボタンClickイベントのイベント ハンドラーに移動し、イベント ハンドラーを削除しTextChangedます。次に、ボタンがクリックされると、テキスト ボックスもクリアし、フォーカスをテキスト ボックスに戻します。

これで準備完了です。

バーコード スキャナーに正しいサフィックスが既に構成されているかどうかを簡単に確認できます。メモ帳を開き、いくつかのバーコードをスキャンします。それらがすべて別々の行に表示される場合は、すべて問題ありません。それ以外の場合は、スキャナーのマニュアルから構成バーコードをスキャンする必要があります。

すべてを要約すると、これはボタンのClickイベントのコードになります。

private void btnCheckMember_Click(object sender, EventArgs e)
{             
    Member member = new Member();
    member.FirstName = "";
    member.LastName = "";            

    string memberText = txtBoxCatchScanner.Text.Trim();
    txtBoxCatchScanner.Text = String.Empty;

    int numTest = 0;
    if (String.IsNullOrEmpty(memberText) ||!Int32.TryParse(memberText, out numTest))
    {
        //IS NOT A NUMBER
        lblAlert.Text = "INVALID - NOT A NUMBER";                
        return;
    }

    member.MemberID = numTest;
    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 !!";

            SoundPlayer simpleSound = new SoundPlayer(@"C:\\WORKTEMP\\siren.wav");
            simpleSound.Play();
        }
        else
        {
            lblAlert.Visible = true;
            lblAlert.Text = mem.MemberStatus;
        }
    }
}

このソリューションにより、次の問題が回避されます。

  1. テキスト ボックスのコンテンツに文字が追加/削除されるたびにイベントがトリガーされます (バーコードをスキャンする場合も同様です: キーボードで入力されたかのように 1 つずつ追加されます)。
  2. 1. 入力した文字ごとにメンバーチェックが行われる問題に起因する
  3. 2.データベースにメンバーが存在する場合、メンバーが見つかった後にチェックが停止するためXYZ、メンバーが見つからないという問題に起因するXYXY
  4. 3. の結果として、 memberXYも見つからず、 member のみが検出されるという問題が発生しましZた。これは、3. でテキスト ボックスがクリアされ、入力されZている唯一の文字であるためです。
于 2013-01-23T12:41:34.580 に答える