
.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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
C# DataTableに最後に追加した行をDataGridView上で選択状態にする方法は?
C言語・C++・C#
-
C# DataGridView のヘッダーセル中央揃え
C言語・C++・C#
-
コンボボックスでドロップダウンリストにしたときに・・・・
Visual Basic(VBA)
-
-
4
DataGridViewの、選択されている行を取り出したい
Visual Basic(VBA)
-
5
DataGrdViewに関連付けたデータの更新
C言語・C++・C#
-
6
datagridviewの並べ替え
Visual Basic(VBA)
-
7
CloseとDisposeの違い
Visual Basic(VBA)
-
8
[C#] DataGridViewでコンボボックスでの変更がdataTableに反映されません
その他(プログラミング・Web制作)
-
9
C# dataGridViewの値だけクリア
C言語・C++・C#
-
10
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
11
DataGridViewに空白がある場合はエラーにしたい
Visual Basic(VBA)
-
12
DataGridViewの各セル幅を自由に決め、その幅で固定したい
Visual Basic(VBA)
-
13
メッセージボックスを大きくする方法
Visual Basic(VBA)
-
14
DataGridViewのチェックボックスのON、OFFの判定方法
C言語・C++・C#
-
15
【C#】DataGridViewの最大列数について
システム
-
16
インスタンス参照でアクセスできない。代わりに型名?
C言語・C++・C#
-
17
C#で動的配列Listの中身をListBoxに表示するには
C言語・C++・C#
-
18
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
19
C# DataGridView の列ヘッダーのマウス右クリックイベントにつきまして
C言語・C++・C#
-
20
画面を強制的に再描画させる方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
C言語・要素除去
-
C# DataTableの行をソートしてD...
-
VB.NETでファイル名順にファイ...
-
GridViewで列のソートを無効に...
-
データ数が多い場合のソート
-
ソートについて(その他質問あ...
-
DirectoryInfo型配列ソート(C#)
-
excel VBA の条件をつけての列...
-
(VBA) Dir 関数で取得するファ...
-
Double型ソート方法
-
int num[10]という配列に、適当...
-
VB6 任意の順番でのソート
-
VBA基本構文の作り方 2列の...
-
Excel VBA テキストボックス内...
-
リスト構造のソートで悩んでま...
-
VB6でデータを昇順に並べ替える
-
C言語でのソート方法
-
構造体配列の並べ替え
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VB.NETでファイル名順にファイ...
-
C# DataTableの行をソートしてD...
-
VBA基本構文の作り方 2列の...
-
ファイル名「1.jpg ~10.jpg~...
-
あるディレクトリ内のファイル...
-
GridViewで列のソートを無効に...
-
C言語・要素除去
-
excel VBA の条件をつけての列...
-
Excelですべての組合せ(重複組...
-
VBScriptで配列のソートをする...
-
配列の問題
-
ブック.csvを開かずに他のブッ...
-
2次元配列を複数項目でソートし...
-
構造体配列のソート
-
listboxの並び替え
-
構造体のリストをソートしたい。
-
リスト構造のソートで悩んでま...
-
文字列をソートする方法
おすすめ情報
レイアウトが崩れていない状態のソースはこちらです。
https://ideone.com/tpFnyp
備忘録です。
datagridviewの並び替えグリフを解除する方法
http://yamamotoplog.blog38.fc2.com/blog-entry-15 …