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

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

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

Q&A

解決済

1回答

1701閲覧

C# datagridview に表示した表のヘッダーを入れ替え削除

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

DataGrid

GUIの一種であり、データを表の形式でみることが可能です。

C#

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

0グッド

0クリップ

投稿2020/08/28 06:16

編集2020/08/28 08:30

csvファイルを取り込んでdatagridviewに表示した表のヘッダーの順番を入れ替え行のデータも一緒に変えること。表示する行データの選択。選択したヘッダの行データ1列削除することは可能なのでしょうか?

private void Read(string filepath) { DataTable dataTable = new DataTable(); string[] lines = File.ReadAllLines(filepath,Encoding.GetEncoding("Shift_JIS")); if(lines.Length>0) { string firstline = lines[0]; string[] strHeader = firstline.Split(','); foreach(string strWorld in strHeader) { dataGridView1.Columns.Clear(); dataTable.Columns.Add(new DataColumn(strWorld)); } for(int row=1;row<lines.Length;row++) { string[] word = lines[row].Split(','); DataRow dataRow = dataTable.NewRow(); int columindex = 0; foreach(string strWorld in strHeader) { dataRow[strWorld] = word[columindex++]; } dataTable.Rows.Add(dataRow); } } if(dataTable.Rows.Count>0) { dataGridView1.DataSource = dataTable; } } ``` サンプルとして コード,名前,生息地,番号,メールアドレス 0001,佐藤,神奈川県,0000-00-0000,nakayama@aaa.com 0002,土田,新潟県,0120-00-1245,sdjnaidm@aaa.com 0003,中山,富山県,0786-00-0000,fhsuw@aaa.com 0004,田中,愛知県,0516-00-2652,aaaaa@aaa.com 0005,山田,石川県,0585-58-5482,yamada@aaaa.com 0006,鈴木,山梨県,0555-55-5555,suzuki@aaaa.com 0007,大田,福岡県,5584-58-2541,oota@saaa.com

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

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

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

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

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

Zuishin

2020/08/28 06:19 編集

可能です。サンプルデータと、それを読み込んで表示できる、完全に動く最小のコードを用意してください。
退会済みユーザー

退会済みユーザー

2020/08/28 08:12

一応、実行可能です。
Zuishin

2020/08/28 08:20

dataTable と data、path と filePath を間違えているように見えます。書き換える時に間違ったんだと思いますが、一度コンパイルしてエラーが出ないことを確かめてから掲載してください。回答がブレてしまいます。
退会済みユーザー

退会済みユーザー

2020/08/28 08:32 編集

すみません確認不足でした。修正いたしましたコンパイルエラーも起きなかったです。
guest

回答1

0

ベストアンサー

下準備として、デザイナーから BindingSource を追加し、bindingSource1 と名付けてください。
次に dataGridView1 のプロパティを開き、DataSource に bindingSource1 を入れてください。

それからソースを次のように書き換えます。

C#

1using System; 2using System.Data; 3using System.IO; 4using System.Linq; 5using System.Text; 6using System.Windows.Forms; 7 8namespace WindowsFormsApp1 9{ 10 public partial class Form1 : Form 11 { 12 public Form1() 13 { 14 InitializeComponent(); 15 } 16 17 //private void Read(string filepath) 18 private DataTable Read(string filepath) 19 { 20 DataTable dataTable = new DataTable(); 21 string[] lines = File.ReadAllLines(filepath, Encoding.GetEncoding("Shift_JIS")); 22 if (lines.Length > 0) 23 { 24 string firstline = lines[0]; 25 string[] strHeader = firstline.Split(','); 26 foreach (string strWorld in strHeader) 27 { 28 //dataGridView1.Columns.Clear(); 29 dataTable.Columns.Add(new DataColumn(strWorld)); 30 } 31 for (int row = 1; row < lines.Length; row++) 32 { 33 string[] word = lines[row].Split(','); 34 DataRow dataRow = dataTable.NewRow(); 35 int columindex = 0; 36 foreach (string strWorld in strHeader) 37 { 38 dataRow[strWorld] = word[columindex++]; 39 } 40 dataTable.Rows.Add(dataRow); 41 } 42 } 43 //if (dataTable.Rows.Count > 0) 44 //{ 45 // dataGridView1.DataSource = dataTable; 46 //} 47 return dataTable; 48 } 49 50 private void button1_Click(object sender, EventArgs e) 51 { 52 dataGridView1.Columns.Clear(); 53 dataGridView1.AutoGenerateColumns = true; 54 bindingSource1.DataSource = Read("TextFile1.txt") 55 .AsEnumerable() 56 .Where(a => a.Field<string>("名前")?.Contains("田") ?? false) 57 .Select(a => new 58 { 59 生息地 = a.Field<string>("生息地"), 60 名前 = a.Field<string>("名前") 61 }); 62 } 63 64 private void button2_Click(object sender, EventArgs e) 65 { 66 bindingSource1.RemoveCurrent(); 67 } 68 } 69} 70

元のコードでは読み込みと同時に dataGridView1 の操作をしていましたが、読み込みと操作は別のメソッドに分けた方がいいため、分けました。今回は手を抜いて DataTable を返すようにしましたが、DataTable は以降使わないので専用のクラスを作った方が拡張性が増します。

button1 を押すことにより、データが読み込まれ、名前に「田」の付く人のみ選択されます。カラムは生息地と名前のみで、この順番で表示されます。この詳細は LINQ を調べてください。

この中で難しいのは次の行ではないかと思います。

C#

1.Where(a => a.Field<string>("名前")?.Contains("田") ?? false)

?.Null 条件演算子??null 合体演算子 で、ともに null 安全のために使われます。
このコードは下記と同じです。

C#

1.Where(a => 2{ 3 var name = a.Field<string>("名前"); 4 if (name == null) return false; 5 return name.Contains("田"); 6}

また butto2 を押すことにより、選択中の行が削除されます。

追記

なお、実行時に列の入れ替えを可能にするには、AllowUserToOrderColumns プロパティを true にしてください。そうすると、ヘッダをドラッグすることで入れ替えることができるようになります。

投稿2020/08/28 09:06

編集2020/08/28 09:40
Zuishin

総合スコア28669

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

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

退会済みユーザー

退会済みユーザー

2020/08/28 10:02

ありがとうございます。無事できました。 度々聞いてしまってすみません 例えば、性別の情報いらないと判断したときに削除して列を減らすことってできるんでしょうか?
Zuishin

2020/08/28 10:08

このコードでは名前と生息地以外すべて削除しています。同じ方法でできます。実行時に行うには dataGridView1.Columns がら該当カラムを削除すればいいと思います。
退会済みユーザー

退会済みユーザー

2020/08/28 10:28

実行時に行いたくて一応、 foreach (DataGridViewColumn column in grid.SelectedColumns) { grid.Columns.Remove(column); } この文で実行してみたのですが、そもそも、ヘッダー部分を選択することができないのですが、仕様上不可能なのでしょうか。
Zuishin

2020/08/28 10:32

ヘッダー部分は選択できません。 たいていは右クリックで行いますが、それはまた別の質問ではありませんか? 適当なボタンで実験してみて、それでできたら同じ方法で削除は可能ということで、改めて後でゆっくりコンテキストメニューを研究すればいいと思います。 問題は一度に解決しようとせず、小さい問題に分割して順に解決しましょう。 とりあえず、この質問については解決できたものと思いますが、違いますか? 削除は先ほど書いたようにこの方法でできます。 > dataGridView1.Columns がら該当カラムを削除すればいいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問