none
テキストボックスに入力した数値の長さが13桁以下ならば、テキストボックスの値をクリアしたい RRS feed

  • 質問

  • いつもお世話になっています。

    現在、C#でJANコード(13桁)をスキャンした際に、DataGridViewに値を出力というプログラムについて学習中です。

    プログラム内で、もしもスキャンされたJANコードが13桁未満であった場合、テキストボックス内の値、テキストボックス内の値を代入した変数値をクリアしたいと考えているのですが、スキャンした際に最初から13桁でないと判定されてしまい、うまく動きません。

    13桁未満であるという判定をうまく行うためにはどうプログラムを変えるべきなのでしょうか?

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.OleDb;
    
    namespace TestDatabaseApp_5
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            private DataTable dt = new DataTable();
            private int cnt = 0;
            private DataSet ds = new DataSet();
            private string Input_str = "";  // 入力された数字
            private bool Paid;//会計確定したか否か
            private bool Accounting;//「会計」ボタンを押下したか否か
            private void Form1_Load(object sender, EventArgs e)
            {
                this.WindowState = FormWindowState.Maximized;//起動時に最大化
                this.FormBorderStyle = FormBorderStyle.None;//起動時にウィンドウ枠なし
                this.ControlBox = false;//起動時に最大化などのコントロールを無効化
                dataGridView1.AutoGenerateColumns = false;//新規行の自動生成を無効化
                dataGridView1.AllowUserToAddRows = false;//新規行のユーザー追加をFalse
                //「商品名」列にnameを、「単価」列にpriceを表示する
                dataGridView1.Columns[3].DataPropertyName = "price";
                dataGridView1.Columns[1].DataPropertyName = "name";
                Paid = false;//ロード時は会計確定していない
                Accounting = false;//ロード時は「会計」ボタンを押下していない
                //フォームをロードした際にtxtBox1にフォーカスする
                this.ActiveControl = this.txtBox1;
            }
    
           // private string path = @"D:\Users\J\Documents\データベース7.accdb";
            private string path= @"C:\Users\user2\Documents\Documents\TestData_2.accdb"; // MDB名など
    
            private void txtBox1_TextChanged(object sender, EventArgs e)
            {
                string text = txtBox1.Text.Trim();
                if (text.Length != 13)
                {
                    //入力された文字(LJAN)が13桁ではなかったら
                    return;
                }
    
                for (int i = 0; i < text.Length; i++)
                {
                    if (!char.IsDigit(text[i]))
                    {
                        MessageBox.Show("数字以外が入力されています");
                        return;
                    }
                }
                long LJAN = long.Parse(text);
    
                OleDbConnection conn = new OleDbConnection();
                OleDbCommand comm = new OleDbCommand();
                conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path;
                conn.Open();
    
                // SELECT文を設定します。
                //データベースからJANコードの一致するレコードのみ検索するようにWHEREで条件を設定する
                comm.CommandText = "SELECT * FROM test_data WHERE id=\"" + text + "\""; //パラメータークエリのが良いけどまずは条件検索を理解する
                comm.Connection = conn;
                OleDbDataAdapter oda = new OleDbDataAdapter();
                oda.SelectCommand = comm;
    
                //dataという名前のDataTableに結果を読み込む
                //すでにdataというテーブルがあるならdataテーブルに追加読み込みされる
                oda.Fill(ds, "data");
    
                conn.Close();
    
                DataTable data = ds.Tables["data"]; //this.dt=data;
                if (this.dataGridView1.DataSource != data)
                {
                    //DataSourceにはDataTableのまま設定(追加で読み込んでいくんで1回だけDataSourceに設定すればいい)
                    this.dataGridView1.DataSource = data;
                }
                dataGridView_Number();
                dataGridView_Counts();
                dataGridView_Price();
                dataGridView_Sum();
                dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.Count - 1;
                txtBox1.SelectAll();
    
                int newCount = data.Rows.Count;
                if (cnt == newCount)
                {
                    MessageBox.Show("JANコードが見つかりませんでした");
                    this.ActiveControl = this.txtBox1;
                    txtBox1.Clear();
                    this.Input_str = "";
                }
                cnt = newCount;
            }
            //小計額計算
            private void dataGridView_Sum()
            {
                int sum = 0;
                for (int i = 0; i < dataGridView1.Rows.Count; ++i)
                {
                    sum += Convert.ToInt32(dataGridView1.Rows[i].Cells[4].Value);
                }
                txtBox2.Text = sum.ToString();
            }
            //列番号入力
            private void dataGridView_Number()
            {
                for (int j = 0; j < dataGridView1.Rows.Count; ++j)
                {
                    dataGridView1.Rows[j].Cells[0].Value = j+1;
                }
            }
            private void dataGridView_Counts()
            {
                for (int j = 0; j < dataGridView1.Rows.Count; ++j)
                {
                    dataGridView1.Rows[j].Cells[2].Value = " 1";
                }
            }
            private void dataGridView_Price()
            {
                for (int j = 0; j < dataGridView1.Rows.Count; ++j)
                {
                   int many = Convert.ToInt32(dataGridView1.Rows[j].Cells[2].Value);
                   int prc = Convert.ToInt32(dataGridView1.Rows[j].Cells[3].Value);
                    dataGridView1.Rows[j].Cells[4].Value = many * prc;
                }
            }
            private void Btn1_Click_1(object sender, EventArgs e)
            {
    
            }
            //会計ボタンを押下した時の動作
            private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = "預り金";
                Accounting = true;
                this.ActiveControl = this.txtBox1;
                txtBox1.Clear();
                this.Input_str = "";
            }
            //「0」~「9」、「00」を押下した時の動作
            private void button8_Click(object sender, EventArgs e)
            {
                // senderの詳しい情報を取り扱えるようにする
                Button btn = (Button)sender;
    
                // 押されたボタンの数字(または小数点の記号)
                string text = btn.Text;
                
                // [入力された数字]に連結する
                Input_str += text;
                // 画面上に数字を出す
                txtBox1.Text = Input_str;
            }
            //登録ボタンを押下した時の動作(会計確定)
            private void button14_Click(object sender, EventArgs e)
            {
                if (Accounting == true)
                {
                    int tb2 = Convert.ToInt32(txtBox2.Text);
                    int tb1 = Convert.ToInt32(txtBox1.Text);
                    if (tb2 > tb1)//預り金が小計額よりも少なかったら
                    {
                        MessageBox.Show("預り金不足");
                        this.ActiveControl = this.txtBox1;
                        txtBox1.Clear();
                        Input_str = "";
                    }
                    else
                    {
                        int txt = tb1 - tb2;
                        txtBox3.Text = Convert.ToString(txt);
                        Paid = true;//会計確定!
                    }
                }
            }
            //「C」ボタンを押下した時の動作
            private void button2_Click(object sender, EventArgs e)
            {
                if (Paid == true)//会計確定していたら
                {
                    dt.Clear();     //DataTableクリア
                    ds.Clear();     //DataSetクリア
                    txtBox1.Clear();
                    txtBox2.Clear();
                    txtBox3.Clear();
                    label1.Text = "JAN(13桁)";
                    Paid = false;
                    Accounting = false;
                    this.Input_str = "";
                    this.ActiveControl = this.txtBox1;      //JAN入力待機状態へ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
                }
                else {//会計確定していなかったら
                    this.ActiveControl = this.txtBox1;
                    txtBox1.Clear();
                    Input_str = "";
                }
            }
            //「万」ボタンを押下した時の動作
            private void button15_Click(object sender, EventArgs e)
            {
                // senderの詳しい情報を取り扱えるようにする
                Button btn = (Button)sender;
    
                // 押されたボタンの数字(または小数点の記号)
               // string text = btn.Text;
    
                // [入力された数字]に連結する
                Input_str += "0000";
                // 画面上に数字を出す
                txtBox1.Text = Input_str;
            }
            //プログラムの終了
            private void button16_Click(object sender, EventArgs e)
            {
                this.Close();
            }
        }
    }


    • 編集済み chmod_777 2018年1月18日 5:16 タイトルの誤字
    2018年1月18日 5:13

回答

  • バーコードリーダーで読んでいてキーボードインターフェースなんですよね? であれば、読み取った後に改行やタブを付加することができると思いますので、バーコードリーダーの説明書を読んでみて下さい。
    改行やタブなどのキーが来るようになれば、それが来た時点で13桁かどうかを判定することができるようになります。つまり、全て読み取った後に13桁かどうかを判定することができるようになります。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク chmod_777 2018年1月19日 5:34
    2018年1月19日 0:35
    モデレータ
  • どのタイミングで消えていればよいかによりますが
    TextChangedはあまりよくないです。
    フォーカス離れたタイミングで良いならLeaveとか
    再入力を促すならValidatingとかになるかと思います。

    • 回答としてマーク chmod_777 2018年1月25日 4:56
    2018年1月19日 4:59

すべての返信

  • 文字の入力を

     txtBox1_TextChanged(object sender, EventArgs e)

    で拾っているようですが、これだと一文字入力する毎にチェックされるので、13文字入力は無理と思います。
    フォーカスが外れた事 (Leave)で検査するか、別のボタンを押した時点で確認するかのどちらかだと思います。
    Enterキー入力での検査もありかとは思いますが、、、。

    2018年1月18日 13:44
  • バーコードリーダーで読んでいてキーボードインターフェースなんですよね? であれば、読み取った後に改行やタブを付加することができると思いますので、バーコードリーダーの説明書を読んでみて下さい。
    改行やタブなどのキーが来るようになれば、それが来た時点で13桁かどうかを判定することができるようになります。つまり、全て読み取った後に13桁かどうかを判定することができるようになります。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク chmod_777 2018年1月19日 5:34
    2018年1月19日 0:35
    モデレータ
  • どのタイミングで消えていればよいかによりますが
    TextChangedはあまりよくないです。
    フォーカス離れたタイミングで良いならLeaveとか
    再入力を促すならValidatingとかになるかと思います。

    • 回答としてマーク chmod_777 2018年1月25日 4:56
    2018年1月19日 4:59