
.NETでWinFormアプリをC#で製作中です。
Visual Studio Community 2017を使用しています。
デフォルト設定ではDataGridViewの列ヘッダーをクリックすると行を並び変えできますが、表示上だけでバインドしているDataTableには影響がないかと思います。
私がやりたいのは、列ヘッダーをクリックするとDataTableの値をソートしてその結果をDataGridViewに反映(つまり表示を更新)させたいのですが、苦戦しています。
FormとDataSetとDataTableは、添付図のように全てForm Designerで作成・設定したのでそちらはコーディングしていません。
その上で下記のように記述して、ボタンを押すとソートができるところまでは辿りつきました。
しかしDataGridView上でのみソートされているようです。
(試しにDataTableをテキストファイルに書き出すメソッドで確認してもDataTableは元の値のままでした)
private void Form1_Load(object sender, EventArgs e)
{
// テーブルにデータを追加
//タスクテーブルBindingSource.Add("要望", "レベル", "低", "進行中");
studyDataSet.studyTable.Rows.Add("数学", 80, "鈴木");
studyDataSet.studyTable.Rows.Add("国語", 40, "田中");
studyDataSet.studyTable.Rows.Add("社会", 60, "田中");
studyDataSet.studyTable.Rows.Add("英語", 70, "鈴木");
studyDataSet.studyTable.Rows.Add("数学", 80, "田中");
studyDataSet.studyTable.Rows.Add("英語", 90, "田中");
studyDataSet.studyTable.Rows.Add("国語", 80, "鈴木");
studyDataSet.studyTable.Rows.Add("社会", 60, "鈴木");
}
// ボタン「Sort」を押す
private void button1_Click(object sender, EventArgs e)
{
DataView dv = new DataView(studyDataSet.studyTable);
dv.Sort = "教科 ASC";
this.dgv.DataSource = dv.ToTable();
}
// 関数:表データを出力する
private void SaveTaskData()
{
// 出力ファイル名
string path = "data.txt";
// 1行分のデータ
string strData = "";
// 出力設定
StreamWriter sw = new StreamWriter(
path,
false, // 追記ではなく上書き
Encoding.Default);
// 表の一行の値をカンマ区切りで一行の文字列にしていく
foreach (studyDataSet.studyTableRow drTask
in studyDataSet.studyTable)
{
strData = drTask.教科 + ","
+ drTask.点数 + ","
+ drTask.名前 + ",";
// 一行書き込み
sw.WriteLine(strData);
}
sw.Close();
}
「DataTable ソート」等で検索すると沢山ヒットはしますし、色々と見てはみたのですが今一つ答えがストレートに書いてある情報に辿りつけませんでした。。
結局のところどのように記述すれば良いのでしょうか?
アドバイスありましたらぜひお願いします。m(_ _)m

No.1ベストアンサー
- 回答日時:
>>私がやりたいのは、列ヘッダーをクリックするとDataTableの値をソートしてその結果をDataGridViewに反映(つまり表示を更新)させたいのですが、苦戦しています。
いままで仕事でDataGridViewを扱うプログラムをいろいろ見たことありますが、質問者さんのやりたいような機能を実現しているプログラムはゼロです。
一般的に、DataGridView上での並びは変えたいけど、DataTableつまりは、Databaseのデータの並びは仕組み的に変えられないからです。
もし、画面上で変えた並び順のデータをDataTableに書き戻したいなら、DataTableの中身を一度消して、DataGridViewからDataTableに新しく書き込むといいと思います。
lv4uさんご回答ありがとうございます!
>質問者さんのやりたいような機能を実現しているプログラムはゼロです。
そうなのですね‥!
そもそも私がそうしたいと思ったのは異端な考えだったんですね、、
なぜそうしたいと思ったかというと、DataGridViewの標準機能のヘッダークリックによる自動ソートを使用すると、アプリ起動時にソート中に新しくRow.Addすると最後の行じゃなくソートが反映された位置に追加されて、どこに追加されたのか分からなくなって不便に感じたからです。
(これは当然の挙動とも思いますし便利とも思うのですが)
加えて、1つ前にソートした結果を保って新しい列をソートしてくれないからです。
(A列を昇順ソートした後にB列を昇順ソートしたら、B列が同じ値ならA列の値は昇順に並んだままにして欲しい)
自前のソートであれば引数で列を二つ選んでのソートが可能なようなので、一つ前にソートした列を覚えさせておいて自前でソートさせる方が良さそうですね。。
それから、一度ヘッダークリックしてしまうと自動ソートをやめること(エクセルで言う”並べ替えとフィルタ”のクリア)もできないですが、登録順に番号を振った列を先頭にでも追加してやれば登録順に戻せるようにするのも容易だなと思いました。
その上で本当にDataTableを並び変える必要があるのか今一度見直したいと思います。
やっぱり並び変えをDataTableに戻してやりたいと思ったら、アドバイスいただいた方法でやってみたいと思います!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- その他(プログラミング・Web制作) pythonリストの特定の値を表示htmlで表示できない 2 2022/05/14 05:48
このQ&Aを見た人はこんなQ&Aも見ています
-
C# DataTableに最後に追加した行をDataGridView上で選択状態にする方法は?
C言語・C++・C#
-
C# DataGridView のヘッダーセル中央揃え
C言語・C++・C#
-
DataGridViewの、選択されている行を取り出したい
Visual Basic(VBA)
-
-
4
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
5
CloseとDisposeの違い
Visual Basic(VBA)
-
6
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
7
datagridviewの並べ替え
Visual Basic(VBA)
-
8
DataSetから、DataTableを取得したい。
C言語・C++・C#
-
9
DataGridViewのチェックボックスのON、OFFの判定方法
C言語・C++・C#
-
10
[C#] DataGridViewでコンボボックスでの変更がdataTableに反映されません
その他(プログラミング・Web制作)
-
11
C# dataGridViewの値だけクリア
C言語・C++・C#
-
12
C#で動的配列Listの中身をListBoxに表示するには
C言語・C++・C#
-
13
C# DataGridView の列ヘッダーのマウス右クリックイベントにつきまして
C言語・C++・C#
-
14
DataGridViewの各セル幅を自由に決め、その幅で固定したい
Visual Basic(VBA)
-
15
DataGridViewに空白がある場合はエラーにしたい
Visual Basic(VBA)
-
16
C#で角が丸いテキストボックス
その他(プログラミング・Web制作)
-
17
DataGridViewのフォーカス遷移について
Visual Basic(VBA)
-
18
別のフォームで記述している関数を実行するには?C#
C言語・C++・C#
-
19
【C#】DataGridViewの最大列数について
システム
-
20
DataGridViewソート時に先頭行を固定する
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# DataGridView のヘッダーセ...
-
ファイル名「1.jpg ~10.jpg~...
-
C言語・要素除去
-
VB.NETでファイル名順にファイ...
-
2次元配列を複数項目でソートし...
-
Excelですべての組合せ(重複組...
-
C# DataTableの行をソートしてD...
-
csvファイル内にてソートす...
-
javaのソートについて。
-
System.IO.Directory.GetFiles...
-
C言語について
-
n番目に大きい数を求めるアル...
-
Excel VBAで並べ替えをしたい
-
スプレッドでのソート
-
GridViewで列のソートを無効に...
-
サイトで価格順で表示するなど...
-
数字文字列のソート方法
-
VB.net データセットからのCSV...
-
VBScriptで配列のソートをする...
-
C言語の一次元配列に関する問題...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VBA基本構文の作り方 2列の...
-
C言語・要素除去
-
C# DataTableの行をソートしてD...
-
VB.NETでファイル名順にファイ...
-
構造体配列の並べ替え
-
あるディレクトリ内のファイル...
-
配列の問題
-
10個の整数を入力して小さい順...
-
2次元配列を複数項目でソートし...
-
構造体のリストをソートしたい。
-
DataGridViewソート時に先頭行...
-
DataGridViewのソートを止めたい
-
datagridviewの並べ替え
-
C++ 入力した3つのint型の整数...
-
DataGridViewの複数列を連動し...
-
Excelですべての組合せ(重複組...
-
C#のリストボックスで、クリッ...
-
VBScriptで重複レコードを削除...
おすすめ情報
レイアウトが崩れていない状態のソースはこちらです。
https://ideone.com/tpFnyp
備忘録です。
datagridviewの並び替えグリフを解除する方法
http://yamamotoplog.blog38.fc2.com/blog-entry-15 …