- 締切済み
VB2005 DataGridViewの全角・半角混在のカラムの並び替え
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 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- irija_bari
- ベストアンサー率73% (70/95)
VB初心者です。僭越とは存じますが、ちょっと調べてみたので書いてみます。 ・読み込み時に全角括弧「」と半角括弧[]が別々ということは、 Oracleでは単純に文字コードでソートしている。 (読み込み時に空白が最後尾ということはDESCを付けているのでしょうか?) >並び替え後は半角と全角との区別はなく、並び替えられます ・これは文字コードが原因ではなく、VBで「あいまい検索」のようなことが行われているのではないでしょうか? 「あいまい検索」とは、「a」と「A」を同一のものとして見て検索するという意味です。 DataGridView.Sort メソッド (IComparer) http://msdn2.microsoft.com/ja-jp/library/wstxtkxs(VS.80).aspx というメソッドがあります。 また、 Comparer クラス http://msdn2.microsoft.com/ja-jp/library/system.collections.comparer(VS.80).aspx というクラスがあります。 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 ====
お礼
irija_bariさん、ありがとうございます。 oracle8.1.6以上では、NULLは最後尾にソートされるのが、標準です。 もしも、NULLを先頭にするならば、sql文に[nulls first]をつけ加える必要があります。客先の要望もNULLは最後尾にという要望だったので、DataGridViewの並び替え時の扱いとは違ってきます。 irija_bariさんも言われるとおり、文字コードでのソートが必要だと思ったで、shift_jisコードに変換してそれをソートいました。NULLだったら、999をセットしました。 ありがとうございました。