質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

2629閲覧

C# DataTableのデータチェックと出力

hisamoto

総合スコア17

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/11/03 09:36

編集2020/11/03 10:50

DataTableの値をチェック と DaraGridViewへ出力

Windows AppでCSVファイルを読み込んで、DataGridviewへ表示させるプログラムを作成しています。
CSVファイルを読み込んでDataTableへ値を入れるところまで成功しました。

この後にデータを出力したいと考えております。
条件はカラム"[SUPPLIER NAME ]"の値が[AAA]または[BBB]の行のみを
DatagridViewへ表示させたいと考えています。

発生している問題・エラーメッセージ

System.Data.SyntaxErrorException: 'Syntax error: Missing operand after 'NAME' operator.'

該当のソースコード

C#

1 { 2 CsvPrototype csv = new CsvPrototype(openFileDialog1.FileName); 3 DataTable dataTable = csv.CsvToDataTable(); 4 //dataGridView1.DataSource = dataTable; 5 6 // Presuming the DataTable has a column named Date. 7 string expression = "[SUPPLIER NAME ] = 'AAA' or [SUPPLIER NAME ] = 'BBB'"; 8 // string expression = "OrderQuantity = 2 and OrderID = 2"; 9 10 // Sort descending by column named CompanyName. 11 string sortOrder = "[INVOICE NO ] ASC"; 12 DataRow[] foundRows; 13 14 // Use the Select method to find all rows matching the filter. 15 foundRows = dataTable.Select(expression, sortOrder); 16 17 // Print column 0 of each returned row. 18 for (int i = 0; i < foundRows.Length; i++) 19 dataGridView1.DataSource = (foundRows[i][2]); 20 21 }

試したこと

行データの取得はできているようですが、DataGridViewへの出力ができておりません。

下記のサイトを参考にしました。
https://prog.temochic.com/datatable-select/
https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.select?view=netframework-4.8

補足情報(FW/ツールのバージョンなど)

VisualStudio2017
.NET.Framework 4.6.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/11/03 10:18

今回の質問はC#なので「VB2017」の記述はおかしいです。 VBと書くとVisualBasicのことを指します。 多分VisualStudio2017のことだとは思いますが、修正したほうがいいでしょう。
hisamoto

2020/11/03 10:58

修正させていただきました。ご指摘ありがとうございました。
guest

回答2

0

ベストアンサー

DataTable.Select などは使わないで、DataTable.DefaultView プロパティで DataTable から DataView を取得して、その Sort, RowFilter プロパティを使用してはいかがですか?

データの並べ替えとフィルター処理
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/dataset-datatable-dataview/sorting-and-filtering-data

使い方の具体例は、以下の記事が参考になりませんか?

CSV ファイルを DataGridView に表示
http://surferonwww.info/BlogEngine/post/2020/09/11/show-date-in-csv-file-on-datagridview.aspx

CVS ファイルを DataGridView に表示するアプリで、以下の構成になっています。

CSV ファイル => CSV パーサー => DataTable => BindingSource => DataGridView

テキストボックス入力により、CSV から作成した DataTable の ProductName フィールドをあいまい検索するコードを実装していますが、その部分のみ以下に抜粋しておきます。

private void button1_Click(object sender, EventArgs e) { if (!String.IsNullOrEmpty(this.textBox1.Text)) { this.table.DefaultView.RowFilter = "ProductName LIKE '%" + this.textBox1.Text + "%'"; this.bindingSource1.DataSource = this.table; } else { // 元に戻す this.table.DefaultView.RowFilter = ""; } }

DataTable.Select は不要です。

投稿2020/11/04 02:50

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考にされたページの最後にもリンクがありますが、DataTable.Selectメソッドの条件文は「DataView RowFilter の構文 [C#]」を参照してください。
SQLに近い文法となっていてスペースがあると別の句として扱われます。
なので列名の"SUPPLIER NAME "は"SUPPLIER"と"NAME"に区別されて解釈されます。
これを1つのものとして認識させるには[SUPPLIER NAME ]と[]で囲う必要があります。
複数条件の書き方もSQLと同様で"条件A or 条件B"といった感じの記述となります。

列名が"SUPPLIER NAME"という形であればまだ分かりますが、何故に後ろに無駄なスペースがあるのでしょうか?
CSVの見出しとして
SUPPLIER NAME ,DATA1,DATA2
とあったとしても後ろの無駄なスペースはDataTableを作成する際に消すことをお勧めします。

投稿2020/11/03 10:15

YAmaGNZ

総合スコア10469

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hisamoto

2020/11/03 10:46

ありがとうございます。参考にさせていただきます。
hisamoto

2020/11/03 10:59

こちらの無駄なスペースを削除するにはどういった方法を使えばいいでしょうか?
YAmaGNZ

2020/11/03 11:09

「C# スペース除去」で検索されるとよろしいかと
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問