C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: DatagridViewのソートについて


(過去ログ 78 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■46200 / inTopicNo.1)  DatagridViewのソートについて
  
□投稿者/ ラテラル (21回)-(2010/01/28(Thu) 02:35:46)

分類:[.NET 全般] 

いつもお世話になっております。
空白を含む数件のデータ列に対し、ソートを行ったのですが、降順で行った場合

空白
------------
空白
------------

------------

------------

と空白から先にソートされてしまいます。


------------

------------
空白
------------
空白
------------

とする場合はどのようにすればよいでしょうか。
DataView.Sortプロパティを参考にしたのですが方法が見つからなかったです・・・
是非ご教授お願いいたします。
引用返信 編集キー/
■46206 / inTopicNo.2)  Re[1]: DatagridViewのソートについて
□投稿者/ επιστημη (2411回)-(2010/01/28(Thu) 09:50:01)
επιστημη さんの Web サイト
> DataView.Sortプロパティを参考にしたのですが方法が見つからなかったです・・・

http://msdn.microsoft.com/ja-jp/library/wstxtkxs(VS.80).aspx
↑サンプルまで付いてます。

引用返信 編集キー/
■46248 / inTopicNo.3)  Re[2]: DatagridViewのソートについて
□投稿者/ ラテラル (22回)-(2010/01/28(Thu) 22:05:34)
No46206 (επιστημη さん) に返信
>>DataView.Sortプロパティを参考にしたのですが方法が見つからなかったです・・・
>
> http://msdn.microsoft.com/ja-jp/library/wstxtkxs(VS.80).aspx
> ↑サンプルまで付いてます。
>

すいません。上記のサンプルを実行いたしましたが、結果は同様の処理でした。
下記のように表示するにはサンプルをどのように変更すればよいでしょうか・・・
空白はソートを無視する。のようにできれば良いのですが・・・
もう少し具体的なサンプルを頂ければと幸いです。

どぷぞよろしくお願いします。


引用返信 編集キー/
■46252 / inTopicNo.4)  Re[3]: DatagridViewのソートについて
□投稿者/ επιστημη (2417回)-(2010/01/28(Thu) 22:27:03)
επιστημη さんの Web サイト
> 下記のように表示するにはサンプルをどのように変更すればよいでしょうか・・・
> 空白はソートを無視する。のようにできれば良いのですが・・・

"空白はいかなる文字列より大きい"と判断される比較オブジェクト書くだけじゃん。

> もう少し具体的なサンプルを頂ければと幸いです。

これ以上具体的て?
まさか"そのものヅバリ"な答もらってそのままパクりたいってこと?

引用返信 編集キー/
■46290 / inTopicNo.5)  Re[4]: DatagridViewのソートについて
□投稿者/ ラテラル (23回)-(2010/01/29(Fri) 14:16:17)
No46252 (επιστημη さん) に返信
>>下記のように表示するにはサンプルをどのように変更すればよいでしょうか・・・
>>空白はソートを無視する。のようにできれば良いのですが・・・
>
> "空白はいかなる文字列より大きい"と判断される比較オブジェクト書くだけじゃん。
>
>>もう少し具体的なサンプルを頂ければと幸いです。
>
> これ以上具体的て?
> まさか"そのものヅバリ"な答もらってそのままパクりたいってこと?
>

Private Class RowComparer
Implements System.Collections.IComparer

Private sortOrderModifier As Integer = 1

Public Sub New(ByVal sortOrder As SortOrder)
If sortOrder = sortOrder.Descending Then
sortOrderModifier = -1
ElseIf sortOrder = sortOrder.Ascending Then

sortOrderModifier = 1
End If
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements System.Collections.IComparer.Compare

Dim DataGridViewRow1 As DataGridViewRow = CType(x, DataGridViewRow)
Dim DataGridViewRow2 As DataGridViewRow = CType(y, DataGridViewRow)

' Try to sort based on the Last Name column.
Dim CompareResult As Integer = System.String.Compare( _
DataGridViewRow1.Cells(1).Value.ToString(), _
DataGridViewRow2.Cells(1).Value.ToString())

' If the Last Names are equal, sort based on the First Name.
If CompareResult = 0 Then
CompareResult = System.String.Compare( _
DataGridViewRow1.Cells(0).Value.ToString(), _
DataGridViewRow2.Cells(0).Value.ToString())
End If
Return CompareResult * sortOrderModifier
End Function
End Class

下記コードでセル(1)同士を比較し、
DataGridViewRow1.Cells(1).Value.ToString(), _
DataGridViewRow2.Cells(1).Value.ToString())
イコールだったらCompareResultを0にしてセル(0)同士を比較ということですよね。


>"空白はいかなる文字列より大きい"と判断される比較オブジェクト書くだけじゃん。
比較オブジェクトを調べてあまりまだピンときていないのですが、下記のようにセル1同士を比較して
空白だったらComparaResultを2(空白はいかなる文字列より大きい)という判断を作ってみました

If System.String.Compare(DataGridViewRow1.Cells(1).Value.Equals(""), DataGridViewRow2.Cells(1).Value.Equals("")) Then
CompareResult = 2
End If

思ったとおりの動きもするのですが、アルファベットなどを入力すると、途中で空白ができてしまったりします。。。
一体ドコに間違いがあるのでしょうか。教えて頂ければ幸いです。
どうぞよろしくお願いします。



解決済み
引用返信 編集キー/
■46291 / inTopicNo.6)  Re[5]: DatagridViewのソートについて
□投稿者/ επιστημη (2422回)-(2010/01/29(Fri) 14:26:56)
επιστημη さんの Web サイト
2010/01/29(Fri) 14:27:26 編集(投稿者)

> 一体ドコに間違いがあるのでしょうか。教えて頂ければ幸いです。

Aは空白じゃない Bは空白じゃない
Aは空白である  Bは空白じゃない
Aは空白じゃない Bは空白である
Aは空白である  Bは空白である

の4通りを用意し、
こしらえた RowComparer に食わせばわかるやん。

引用返信 編集キー/
■46292 / inTopicNo.7)  Re[6]: DatagridViewのソートについて
□投稿者/ ヴァン (55回)-(2010/01/29(Fri) 15:32:26)
No46291 (επιστημη さん) に返信
> 2010/01/29(Fri) 14:27:26 編集(投稿者)
>
>>一体ドコに間違いがあるのでしょうか。教えて頂ければ幸いです。
>
> Aは空白じゃない Bは空白じゃない
> Aは空白である  Bは空白じゃない
> Aは空白じゃない Bは空白である
> Aは空白である  Bは空白である
>
> の4通りを用意し、
> こしらえた RowComparer に食わせばわかるやん。
>

文字列のN番目同士を比較して、

AはNULL     BはNULLじゃない = Aの勝ち
BはNULLじゃない BはNULL     = Bの勝ち
Aは空白     Bは空白じゃない = Bの勝ち
Aは空白じゃない Bは空白     = Aの勝ち
次の文字の勝負

みたいにループさせる必要があるかな。

引用返信 編集キー/
■46293 / inTopicNo.8)  Re[7]: DatagridViewのソートについて
□投稿者/ ヴァン (56回)-(2010/01/29(Fri) 15:33:50)
> AはNULL     BはNULLじゃない = Aの勝ち
> AはNULLじゃない BはNULL     = Bの勝ち
> Aは空白     Bは空白じゃない = Bの勝ち
> Aは空白じゃない Bは空白     = Aの勝ち

だった。
引用返信 編集キー/
■46294 / inTopicNo.9)  Re[5]: DatagridViewのソートについて
□投稿者/ みきぬ (758回)-(2010/01/29(Fri) 15:48:37)
RowComparer は単に比較のルールを決める存在だから、内部で DataGridView なんて使っちゃだめよ。
単に与えられたパラメータ x と y の値に応じて結果を返すようにメソッドの中を作るだけ。

で、DataGridView に「このルールでソートしてね」と RowComparer を与えてあげれば、
ソートするときに DataGridView が x と y にセルの値を入れて使ってくれる。

ちなみにセルの値が文字列に限定していいのなら、両方とも空白でもnullでもないときは
string.Compare() に丸投げしていいんじゃないかな。つまりループはいらないと思う。
引用返信 編集キー/
■46295 / inTopicNo.10)  Re[6]: DatagridViewのソートについて
□投稿者/ ヴァン (57回)-(2010/01/29(Fri) 16:32:08)
No46294 (みきぬ さん) に返信
> RowComparer は単に比較のルールを決める存在だから、内部で DataGridView なんて使っちゃだめよ。
> 単に与えられたパラメータ x と y の値に応じて結果を返すようにメソッドの中を作るだけ。
>
> で、DataGridView に「このルールでソートしてね」と RowComparer を与えてあげれば、
> ソートするときに DataGridView が x と y にセルの値を入れて使ってくれる。
>
> ちなみにセルの値が文字列に限定していいのなら、両方とも空白でもnullでもないときは
> string.Compare() に丸投げしていいんじゃないかな。つまりループはいらないと思う。

データが1文字だけなのかな?と思った。
だから、次の勝負の前に文字同士の比較が必要だね。
そこで決着がつけばいいんだし。
引用返信 編集キー/
■46296 / inTopicNo.11)  Re[7]: DatagridViewのソートについて
□投稿者/ みきぬ (759回)-(2010/01/29(Fri) 16:52:56)
No46295 (ヴァン さん) に返信
>>ちなみにセルの値が文字列に限定していいのなら、両方とも空白でもnullでもないときは
>>string.Compare() に丸投げしていいんじゃないかな。つまりループはいらないと思う。
>
> データが1文字だけなのかな?と思った。

んと、よくわからないんだけど…。
セルに "あいう" と入っていても、x や y には "あ" や "い" とか文字単位でしか入ってこないという意味?
さすがにそれはないんじゃないかなあ。

それとも、3つの列にそれぞれ "あ" "い" "う" と入っていて、それぞれの列でソートしたいってこと?
それってつまり複数列でソートしたいってことで、そもそも問題が違うんじゃないかなあ。


私が想定しているのは、セルの値に "あああ" とか "あいう" があって、それがそのまま x や y に入ってくる状況で、
そのときは return string.Compare("あああ", "あいう") とか丸投げしちゃっていいんじゃないかなあ…と。
だって、空白以外は今まで通りでいいんでしょ?

ただ、その「今まで通り」を実現するのに string.Compare が最適かどうかは私にはわからないけどね。
引用返信 編集キー/
■46307 / inTopicNo.12)  Re[8]: DatagridViewのソートについて
□投稿者/ ヴァン (58回)-(2010/01/29(Fri) 19:22:22)
No46296 (みきぬ さん) に返信
> ■No46295 (ヴァン さん) に返信
> >>ちなみにセルの値が文字列に限定していいのなら、両方とも空白でもnullでもないときは
> >>string.Compare() に丸投げしていいんじゃないかな。つまりループはいらないと思う。
>>
>>データが1文字だけなのかな?と思った。
>
> んと、よくわからないんだけど…。
> セルに "あいう" と入っていても、x や y には "あ" や "い" とか文字単位でしか入ってこないという意味?
> さすがにそれはないんじゃないかなあ。
>
> それとも、3つの列にそれぞれ "あ" "い" "う" と入っていて、それぞれの列でソートしたいってこと?
> それってつまり複数列でソートしたいってことで、そもそも問題が違うんじゃないかなあ。
>
>
> 私が想定しているのは、セルの値に "あああ" とか "あいう" があって、それがそのまま x や y に入ってくる状況で、
> そのときは return string.Compare("あああ", "あいう") とか丸投げしちゃっていいんじゃないかなあ…と。
> だって、空白以外は今まで通りでいいんでしょ?
>
> ただ、その「今まで通り」を実現するのに string.Compare が最適かどうかは私にはわからないけどね。

空白が1文字目ばかりとは限らないから、1文字目から順番に比較する必要があると思ったんだけど。
何か勘違いしちゃったかな?>自分

引用返信 編集キー/
■46308 / inTopicNo.13)  Re[8]: DatagridViewのソートについて
□投稿者/ ラテラル (24回)-(2010/01/29(Fri) 19:39:49)
要するに

For データの列分ループ

Compareで比較

AはNULL     BはNULLじゃない = Aの勝ちは下記で表現
NULLの使い方は・・
AはNULLじゃない BはNULL     = Bの勝ちは下記で表現
NULLの使い方は・・
'Aは空白     Bは空白じゃない = Bの勝ちは下記で表現
DataGridViewRow1.Cells(2).Value.Equals(""), DataGridViewRow2.Cells(2).Value.ToString() = Bの勝ち
Aは空白じゃない Bは空白     = Aの勝ちは下記で表現
DataGridViewRow1.Cells(2).Value.ToString(), DataGridViewRow2.Cells(2).Value.ToString() = Bの勝ち
Loop Next

AはNULL、BはNULLじゃないというNULLの比較の表現が今いち分かりませんでした。
またAの勝ち、Bの勝ちとはどのように表現すれば良いのでしょうか。
他のサイトを参考にして恐らく、勝ち、負けのフラグは-1や、0、1など数値を入れていると思いました・・・

上記のようなロジックを組むと下記エラーになってしまいます。
インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
パラメータ名: index


引用返信 編集キー/
■46328 / inTopicNo.14)  Re[9]: DatagridViewのソートについて
□投稿者/ みきぬ (761回)-(2010/01/30(Sat) 03:09:03)
No46307 (ヴァン さん) に返信
> 空白が1文字目ばかりとは限らないから、1文字目から順番に比較する必要があると思ったんだけど。
> 何か勘違いしちゃったかな?>自分
>
なるほど。

空白 → 空文字(つまり String.Empty)のことだと思ってました。
それか Null。
引用返信 編集キー/
■46335 / inTopicNo.15)  Re[10]: DatagridViewのソートについて
□投稿者/ ヴァン (59回)-(2010/01/30(Sat) 10:46:29)
No46328 (みきぬ さん) に返信
> 空白 → 空文字(つまり String.Empty)のことだと思ってました。
> それか Null。

あっ、やっぱり自分の勘違いだか。
空白=スペースだと思ってました。

引用返信 編集キー/
■46336 / inTopicNo.16)  Re[9]: DatagridViewのソートについて
□投稿者/ ヴァン (60回)-(2010/01/30(Sat) 10:50:59)
No46308 (ラテラル さん) に返信
> 要するに
>
> For データの列分ループ
>
> Compareで比較
>
> AはNULL     BはNULLじゃない = Aの勝ちは下記で表現
> NULLの使い方は・・
> AはNULLじゃない BはNULL     = Bの勝ちは下記で表現
> NULLの使い方は・・
> 'Aは空白     Bは空白じゃない = Bの勝ちは下記で表現
> DataGridViewRow1.Cells(2).Value.Equals(""), DataGridViewRow2.Cells(2).Value.ToString() = Bの勝ち
> Aは空白じゃない Bは空白     = Aの勝ちは下記で表現
> DataGridViewRow1.Cells(2).Value.ToString(), DataGridViewRow2.Cells(2).Value.ToString() = Bの勝ち
> Loop Next
>
> AはNULL、BはNULLじゃないというNULLの比較の表現が今いち分かりませんでした。
> またAの勝ち、Bの勝ちとはどのように表現すれば良いのでしょうか。
> 他のサイトを参考にして恐らく、勝ち、負けのフラグは-1や、0、1など数値を入れていると思いました・・・
>
> 上記のようなロジックを組むと下記エラーになってしまいます。
> インデックスが範囲を超えています。負でない値で、コレクションのサイズよりも小さくなければなりません。
> パラメータ名: index

このindexはCellsの2の事かな?
だとしたら列の数が3つ無いとか。

また、ValueがNULLの可能性もあるので、確認もせずに .Equals や .ToString は危険ですよ。
引用返信 編集キー/
■46511 / inTopicNo.17)  Re[11]: DatagridViewのソートについて
□投稿者/ ラフレシア (1回)-(2010/02/04(Thu) 10:11:29)
■/ ラテラルに返信

 はじめまして。途中割り込み失礼します。
 Datagridviewのソートについてなのですが、ソート結果で空白もソートの対象となるのは使う側としても当然の結果と思います。
 もし、空白に見える行に対してその行をデータの入っている最後に表示させたいのであれば、ソート対象のデータのみを別配列
 またはarrayなどに抜き出し、その中でソートを実施し、ソートした結果をDatagridviewへ設定しなおして、最後に無視した空白
 行を投入すればいいのではないでしょうか?
 ソートの過程でひとつひとつのパターンを判断してソートするよりも単純だと思います。
 と思います。もし、的外れなことを言っていましたらごめんなさい。

 
 
 
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -