初めての店舗開業を成功させよう>>

はじめまして。
Winアプリを作成していますが、ネットで検索をかけても
どうしても分からない事があるのでお教えいただけないでしょうか?

【環境】
Window XP
VS2005 VB.net

【質問】
DataGridViewでソートを行う際にデータをNULL(Nothing)にした部分が
ソートに反映されてしまうのですが、どうにかソートされないように
する方法はありますでしょうか?

例:
データ1
データ2
データ3
NULL
NULL


ソートを行うと
NULL
NULL
データ1
データ2
データ3

希望値としては以下です。
データ1
データ2
データ3
NULL
NULL

もともとはDataGridViewのグリッドをデータ数に関わらず
常に表示したいことから、行き詰ったのですが
どなたか良い方法をご存知ではないでしょうか?
よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

方法は2種類かな


1つは データソース自体にソート用の列を設ける
もう一つは DataGridViewのSortメソッド用にIComparer インターフェイスを継承したクラスを作成して ソートメソッドに与えてやる
このとき引数の Objct xが DBNullだったら DBNullのほうが大きいと返答をするよう
SortメソッドはGridDataViewのColumnHeaderMouseClickイベントなどで使う感じだと思います
ちょうど MSDNのColumnHeaderMouseClickイベントにソートの制御の例が載ってますよ
ただこれは 別の列でソートする例ですけどね
後は GridDataViewのSort(IComparer)メソッドの例が参考になるかも

昇順の場合だけならまだ楽ですが、降順にソートする場合も考慮しないといけないのだと大変だと思いますよ
    • good
    • 0
この回答へのお礼

ご丁寧に回答ありがとうございます!
今回は時間が無いため、前者で行います。。。
本当後者のほうが、今後の為にもよさそうですが・・・

お礼日時:2007/07/26 12:15

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB.NETのDataGridで、選択行の特定の列の内容を取得したい

タイトルにあるとおり、DataGridを使用している場合、実行時に選択された行の特定の列の内容を取得するにはどのようにすればよいのでしょうか?

DataGridは複雑で、まだよくわかっていません。
よろしくお願いします。

Aベストアンサー

選択している行番号は、dataGrid1.CurrentRowIndexでわかります。
行、列を指定して各セルにアクセスするには、
dataGrid1(行番号,列番号)でいいので
dataGrid1(dataGrid1.CurrentRowIndex,列番号)
で選択されている行の特定の列の内容を取得できます。
註:番号は、0始まり

QDataGridViewでセルクリックイベントを発生させるには

DataGridViewでセルクリックイベントを発生させるには、
デザイナからではCellClickイベントハンドラとなりますが、
プログラムコード上から発生させるにはどのようにすればよろしいでしょうか?

CurrentCellでアクティブセルを変更した時に、そこのセルをクリックさせるイベントが欲しいのですが・・

宜しくお願い致します。

Aベストアンサー

CellClickイベントハンドラの内容を別のメソッドとして作り、アクティブセルを変更した際にそのメソッドを呼び出す方法ではダメなのでしょうか?
どうしてもCellClickイベントを発生させて処理をしたいのでしょうか?

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QFORMが開いているかどうかの確認方法

初歩の初歩だと思いますが。。。。

formが開いているかどうかの確認方法を教えてください。プロパティで確認できるのでしょうか?

Aベストアンサー

Form.Visible = True : 表示されている
Form.Visible = False : 表示されていない

でいいと思いますよ~

それとも二重起動禁止の方が知りたいんでしょうか?

Qデータグリッドビューの一番最初の行に列を追加したい

お世話になっています。
VB2005です。
タイトル通りなのですが、DataGridViewの一番最初の列(0列目)に列を追加したいのです。
DataGridView1.Columns.Add()
では一番最後の行に追加されてしまいます。

ヘルプやネット上を見てもわからず・・・
どなたかご存じの方教えてください。

Aベストアンサー

こんばんは。

AddではなくInsertを使います。

TextBoxColumnを追加します。

Dim TextBoxColumn As New DataGridViewTextBoxColumn
Me.DataGridView1.Columns.Insert(0, TextBoxColumn)

でとりあえず追加できます。

後はヘッダーに項目名を設定したり、列幅を設定し足してください。

QDataGridViewの昇順降順。

再びお世話になります。
VB2005で表題の件ご教授願います。
作成した表でカラムスヘッダーをクリックすることによりソートは可能状態です。しかし、数値データを表示させていていて昇順、降順とも文字列としの結果で数値の大小でソートされません。
プロパティでColumnsからCellStyleビルダのFormatを数字に選択しても結果はかわりません。
以上よろしくお願いします。

Aベストアンサー

こんにちは
以下のURLを参考にしてみたらどうでしょうか。
この中の「SortCompareイベントを使用する方法」
のソースを以下のように改造すれば数値の大小でSort可能です。
Private Sub DataGridView1_SortCompare(ByVal sender As Object, _
ByVal e As DataGridViewSortCompareEventArgs) _
Handles DataGridView1.SortCompare
 e.SortResult = Val(e.CellValue1) - Val(e.CellValue2)
 e.Handled = True
End Sub
入力データなどのチェックはしていませんので留意してください。

参考URL:http://dobon.net/vb/dotnet/datagridview/customsort.html

QDataGridViewの特定列に入力されている重複チェックをしたい

VisualBasic2005です。
例えばDataGridViewの3列目にコードが入力されるとします。
その列のコードには重複入力をさせたくないのです。

重複チェックをするのは、そのセルの入力が確定したときでも、
特定のボタンが押されたときでもかまわないので、
チェックする方法はないでしょうか?

よろしくお願いいたします。

Aベストアンサー

そのDataGridViewはDataTableをバインドしてますか?
もしそうなら、DataTableの方で重複をさせたくない列を主キーに設定すれば、重複値を入力したときエラーがでるようになります。
主キーの設定の仕方は例えば
'dtはDataTable
dt.PrimaryKey = New DataColumn() {dt.Columns(2)}

QDataTableから条件を満たした行を別のDatatableへコピーしたい

VC#2005とSQLServer2005ExpressEditionでWindowsアプリケーションを作成しています。

データベースの中から1つのマスタテーブルのデータを呼び出すのにTableAdapterを使ってDataTableにデータをバインドしました。
そこから条件を満たしている行をすべて抽出して同じ型のDataTableにデータをコピーしたいのです。

ですから、DataTableは2つ用意しています。1つは上記の通りデータをバインドしていますが、もう1つは宣言しただけなのでまだ空っぽの状態です。
DataTableにはカラムが3列あり、その中の1列をグループIDとしています。
条件としてはグループIDが同じであるということです。
やりたいことは条件を満たしている行をすべて抽出して空のデータテーブルにコピーすることです。

どなたかご存知の方いらっしゃれば教えてください。
よろしくお願いします。

Aベストアンサー

C#だったんですね … さほど変わりないと思いますが

お使いのコードが提示されていないのでこちらで適当な変数をでっち上げております
現在お使いのコードを支障の無い範囲で提示しましょう

//元のデータテーブルがdtSourceとすると
// テーブル構造をコピー
DataTable dt = dtSource.Clone();
DataRow r = null;
foreach( DataRow dtRow in dtSource.Select("選択するための文字列"))
{
  r = dt.NewRow();
  for( int n = 0; n < dtRow.ItemArray.Length; n++ )
  {
    r[n] = dtRow[n];
  }
  dt.Rows.Add( r );
}
といった具合になると思います

# 前回の投稿中のstSorceはdtSourceの単なるミスです

Qdatagridviewの並べ替え

VB2005でDataGridViewを使用して属性番号、日時順、電圧値といったデータ行を表示させています。
複数のcsvファイルから読み込んで表示させていますが、この表示を属性番号順・日時順といった順で並べ替えをしたいのです。
DataGridView.Sortメソッドを使用して
日時列→属性番号列といった順で連続的にソート処理をしています。
が、上手くいきません。
年末の忙しいところ皆さん申し訳ないのですが、知っている方教えて下さい。
最終的には属性順には並んでいますが、最初の日時順が崩れてしまっています。
日時順を元に属性番号順に並べ替える時に、並び順が下がる対象行があるとします。
この並び順が下がる行データの移動先の位置にあった行データが日時を無視して入れ替わりに上がってきてしまっています・・・

よろしくお願いしますm(__)m

Aベストアンサー

noah7150さんが紹介しているページの日本語版です。

下記URLの
「IComparer インターフェイスを使用したカスタムの並べ替え」
をコピペして動かしてみてください。

' If the Last Names are equal, sort based on the First Name. 
とコメントがあるので、
Last Namesが同じだったら、First Nameでソート・・・
という処理をしているんだと思います。

わかりにくい場合、グリッドの中身を数値に置き換えてみると
わかりやすいかもしれません。

とりあえず動かしてみるとわかると思います。

http://msdn.microsoft.com/ja-jp/library/ms171608.aspx

参考URL:http://msdn.microsoft.com/ja-jp/library/ms171608.aspx


人気Q&Aランキング

おすすめ情報