プロが教えるわが家の防犯対策術!

VB2005で開発、データベースはオラクル10gです。
全角・半角文字混在の項目を昇順で読み込み、DataGridViewの表に取り込みます。その後、ヘッダーカラムの並び替えを行うと順番が変わっていまいます。
具体的には
1.読み込み時は、空白は最尾、並び替え後は先頭にくる。
2.読み込み時、括弧(「[」)の半角と全角は別々に並んでいますが、並び替え後は半角と全角との区別はなく、並び替えられます。

カラムを別に設けて、コード体系を変換して、そのカラムを並び替えすればいいのでしょうか?
コード体系の知識は弱いので、お教えください。

PRIVATE SUB BUTTON_CLICK(省略)
DIM I AS INTEGER
DIM S AS STRING
FOR I = 0 TO DataGridView1.Rows.Count - 1
S = DataGridView1(1,I).VALUE
'-----ここで変換?
   DataGridView1(2,I).VALUE = S
NEXT
DataGridView1.Sort(DataGridView1.Column(2), _
System.ComponentModel.ListSortDirection.Ascending)
END SUB

よろしくお願いします。

A 回答 (1件)

VB初心者です。

僭越とは存じますが、ちょっと調べてみたので書いてみます。

・読み込み時に全角括弧「」と半角括弧[]が別々ということは、
Oracleでは単純に文字コードでソートしている。
(読み込み時に空白が最後尾ということはDESCを付けているのでしょうか?)

>並び替え後は半角と全角との区別はなく、並び替えられます
・これは文字コードが原因ではなく、VBで「あいまい検索」のようなことが行われているのではないでしょうか?
「あいまい検索」とは、「a」と「A」を同一のものとして見て検索するという意味です。


DataGridView.Sort メソッド (IComparer)
http://msdn2.microsoft.com/ja-jp/library/wstxtkx …
というメソッドがあります。

また、
Comparer クラス
http://msdn2.microsoft.com/ja-jp/library/system. …
というクラスがあります。

Comparer にはカルチャを関連付けるようなので、Comparer に日本-日本語カルチャが
関連付けられているために、「」と[]を同一と見ているのでは?


以下のようなコードを書いてみたのですが、myComp を Comparerクラスとして定義しているのに、
DataGridView.Sort() では IComparerを引数としてとるためうまくいきません。
myComp を IComparer として扱いたいのですが、悲しいかなVB初心者のためわかりません。


また、私は SQL Server を使用しているため、JJ-TOさんとは環境が違います。
何か問題解決の足しになれば幸いです。

==== Code ====
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
If Me.DataGridView1.Columns(1).DisplayIndex = 1 Then
Me.DataGridView1.Columns(1).DisplayIndex = 2
Me.DataGridView1.Columns(2).DisplayIndex = 1
Else
Me.DataGridView1.Columns(1).DisplayIndex = 1
Me.DataGridView1.Columns(2).DisplayIndex = 2
End If
'????????????????????
'System.Globalization.CultureInfo()の引数は、
'("ja", False), ("ja", True), ("ja-jp", False), ("ja-jp", True)のどれ?
'????????????????????
Dim myComp As New System.Collections.Comparer(New System.Globalization.CultureInfo("ja", False))

'????????????????????
'myComp (as Comparer)を IComparer として扱うにはどうしたらいい?
'????????????????????
Me.DataGridView1.Sort(myComp)
Me.DataGridView1.Sort(Me.DataGridView1.Columns(1), System.ComponentModel.ListSortDirection.Ascending)
End Sub
==== end of Code ====
    • good
    • 0
この回答へのお礼

irija_bariさん、ありがとうございます。
oracle8.1.6以上では、NULLは最後尾にソートされるのが、標準です。
もしも、NULLを先頭にするならば、sql文に[nulls first]をつけ加える必要があります。客先の要望もNULLは最後尾にという要望だったので、DataGridViewの並び替え時の扱いとは違ってきます。
irija_bariさんも言われるとおり、文字コードでのソートが必要だと思ったで、shift_jisコードに変換してそれをソートいました。NULLだったら、999をセットしました。
ありがとうございました。

お礼日時:2007/09/25 10:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!