前提・実現したいこと
VBでシリアルをバーコードリーダーで読込むと
指定のモノと一致・不一致を判定するAppを作成しています.
バーコードリーダーで読取した文字列を
readSerial
という変数に格納しているとします.
このときreadSerial変数に入っている文字列が
DataGridView内の1列目(10行程度)と一致するものがあれば
”シリアルが重複しています”
というメッセージを表示させたいと考えています.
発生している問題・エラーメッセージ
どのようにコードを書けば良いか分かりません. 例えば、今Listも使用しており指定のListに一致するものがあるかどうかは 下記のソースコードのように書いています.
該当のソースコード
VB.net
1 ElseIf FormMain.ListSerial.Contains(inputSerial) Then 2 'MessageBox.Show("既に読取されたシリアルです") 3 Return False
> 下記のソースコードのように書いています.
その結果はどうなるのですか? 質問者さんの期待する結果とどう異なるのですか?
ありがとうございます.
質問にも書かせていただいている通り、書いてあるコードはListに対して
List内に一致するものがあるかどうかを調べるもので意図通り動きます.
今回質問させていただいているのはDataGridViewの1列目に変数と
一致する文字列があるかどうかを調べたいです.
VBとVB.NETは別物扱いなので、VBタグは削除してください。
このサイトでいうVBは、VB6以下のバージョンを指します。
ちなみに、DataGridViewのCellの値を取得する方法は判ります?
ベタにやるなら、For文で列の各Cellの値とループで比較していけばいいだけだと思いますが。
>radianさん
ご指摘ありがとうございました.
List って何ですか? List(Of T) クラスのことですか?
DataGridView に表示するデータはどうやって渡しているのですか? List(Of T) を渡しているなら、
> List内に一致するものがあるかどうかを調べるもので意図通り動きます.
とのことなのですでに問題なく出来ているはずと思うのですが、何が問題なのですか?
SurferOnWww様
ありがとうございます.
List(Of T) クラスのことです.
今回はラベルに書いてあるシリアルを最初に読取、都度List(Of T) クラスに入れて
規定数に達したらList(Of T) クラスの内容をDataGridViewへ格納
その後List(Of T) クラスをclearして、次に実際の商品のシリアル読取、同じList(Of T) クラスへ都度入れていきます.
その過程でDataGridViewに無いシリアルが来た場合、メッセージを表示したいです.
1回目のラベルのList(Of T) クラスと2回目の商品のList(Of T) クラスを分ければいいと言われればそれまでですが、折角DataGridViewがあるのでList(Of T) クラスは1つにしてDataGridViewと比較できないかと考えた次第です.
radian様
ありがとうございます.
>For文で列の各Cellの値とループで比較
一度この方法で調べてみます.
List(Of T) クラスのようにDataGridViewの1列目全てを扱えると楽だと考えて質問させていただきました.
データソースから List(Of T) を作ってそれを BindingSource 経由で DataGridView にバインドしている、すなわち以下のような構成と理解していいのですか?
データソース (DB, XML, CSV 等々) ⇔ List(Of T) ⇔ BindingSource ⇔ DataGridView
であれば、DataGridView を調べるというのは悪手だと思います。List(Of T) を調べることをお勧めします。
DataGridViewにDataSourceを設定して使ってるなら、DataSource側を検索した方がいいですね。質問文からはどうやってDataGridViewを読み書きしてるか不明なので、これ以上突っ込んだコメントはできませんが。
そもそも「UIコンポーネントをデータの保存に使うな」という話だけども。
質問者さん、その後無言だけど、コメントを多々もらっているのだけら、それに対するフィードバックぐらいは返してはいかが。
SurferOnWww様
申し訳ございません.
>データソースから List(Of T) を作ってそれを BindingSource 経由で DataGridView にバインドしている、すなわち以下のような構成と理解していいのですか?
データソース (DB, XML, CSV 等々) ⇔ List(Of T) ⇔ BindingSource ⇔ DataGridView
素人すぎてBindingSourceが何かが分からないので自分で調べさせていただきます.
今回DataGridViewは1回目の読取したシリアルをList(Of T) ⇒ DataGridViewへ移行させているだけで
DBは存在しDBにもシリアルはありますが、この作業には絡んできません.
1回目読取のラベルのシリアルと2回目読取の商品のシリアルの整合性をその場で確認、整合性が取れていれば再度箱に詰めたいだけでDataGridViewの中身も毎回Clearしております.データのLogなどを残す目的で使用するものではありません.
あくまで一時的に使用するだけなので、
```VB
FormMain.List(Of T).Contains(inputSerial) Then
```
のList(Of T)の部分をDataGridViewでも同じように使うことができないかと思い質問させていただきました.
radian様
ご指摘ありがとうございます.
今後質問させていただく時の情報出しにも注意いたします.
gentaro様
ご指摘ありがとうございます.
一時的(毎作業ごと)にDataGridViewの中身を変えるような場合でも、データを保存するように使うべきではないという事でしょうか?
画面への表示、兼 List(Of T) のような使い方も出来るようなものがあれば教えていただきたいです.
DataGridViewという名前のとおり、Viewなんですよね。(興味があればMVCモデルでググってみて概念を理解してください)DataSourceにデータを設定し、データの方を更新すればDataGridViewの表示も更新される設計になっています。なので、直接DataGridViewの値を操作・参照するということは可能だけど通常はしません。
[DataGridViewのDataSourceに指定できるオブジェクトについての考察]
https://symfoware.blog.fc2.com/blog-entry-787.html
データを検索する、というのはViewは絡まない話になるので、Viewに設定したデータの方を検索すればよい訳です。
> 一時的(毎作業ごと)にDataGridViewの中身を変えるような場合でも、データを保存するように使うべきではないという事でしょうか?
そうです。
それは「表示」用のコンポーネントであり、そこをデータの一時保存場所とするような用途はそもそも想定されていません。
疑問があるならGitHubなり何なりで、世の中のソースコードを眺めましょう。
よほどの初心者でない限りそのような事はやりませんし、企業によってはコーディング規約で明確に禁止している行為です。
> 素人すぎてBindingSourceが何かが分からないので自分で調べさせていただきます.
BindingSource の話はこのスレッドのメインの課題とは直接関係ないのですが、WinForms アプリで List(Of T) や DataTable を DataGridView にバインドする場合は以下のような構造にするのは定番なのでそのように書きました。
List(Of T) / DataTable ⇔ BindingSource ⇔ DataGridView
詳しい理由は Microsoft の公式ドキュメントを読んでいただくとして、BindingSource の話はとりあえず置いときましょう。
> あくまで一時的に使用するだけなので、
> FormMain.List(Of T).Contains(inputSerial) Then
> のList(Of T)の部分をDataGridViewでも同じように使うことができないかと思い質問させていただきました.
できません。悪手だと書いたのはそれも理由の一つです。List(Of T) ならそういうメソッドが用意されていますし Linq も使えます。DataGridView は UI なのでそういうことに使うものではなく、期待する機能は備わってませんので。
どういう方向に進むことにしたのでしょうか? 助言を受け入れて DataGridView を探すのは止めてそのデータソースの方を探す? それとも、あくまで DataGridView の方を探す?
皆様
ご丁寧に回答いただきありがとうございました.
ご指摘いただいた点に関して、勉強させていただきます.
回答に関してはSurferOnWww様の
期待する機能は備わってません
という1文が、最も知りたかった部分になると思っています.
お時間いただき本当にありがとうございました.
SurferOnWww様
List(Of T)をもう1つ準備し、最初に読取したシリアル群をそちらに格納して
2回目に読取したシリアルがList(Of T)に含まれているかどうかを確認することにしました.
回答1件
あなたの回答
tips
プレビュー