DataGridのソートイベントを取得するには?

解決


GOUF  2005-04-20 10:27:51  No: 89485  IP: [192.*.*.*]

環境はVB.NET2003です。

DataGridの上部の見出し部分をクリックするとソートされますよね。
そのイベントを取得する方法というのはあるのでしょうか?どのようにすればいいのかわかりませんでした。

ソートだけでは内容の変更とはとらえないので、change系のイベントは発生しないようでしたし、単にクリックイベントだと、クリック直後のソートされる前にイベントを取得してしまい、目的の動きはできませんでした。

ご教授、よろしくお願いします。

編集 削除
ささ  2005-04-20 11:17:55  No: 89486  IP: [192.*.*.*]

>目的の動きはできませんでした

目的の動きを説明したほうが、解決は早そうだと思います。

編集 削除
GOUF  2005-04-20 12:33:31  No: 89487  IP: [192.*.*.*]

さささん
ありがとうございます。

>目的の動きを説明したほうが、解決は早そうだと思います。

目的の動きとは、見出し部分をクリックしソートが行われた直後のイベントをキャッチすることです。

ソート直後にメッセージボックスで「OK」等と出すことができれば目的達成です。

こんな感じでわかりますか?

編集 削除
ささ  2005-04-20 13:09:25  No: 89488  IP: [192.*.*.*]

ソート完了後に、メッセージを表示したい。
ということでOKだと思います。

参考リンクを見つけたのでどぞ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=11209&forum=7

編集 削除
ささ  2005-04-20 13:11:24  No: 89489  IP: [192.*.*.*]

上記リンクの ぞのぞの さんの発言と、
その中にあるリンク先を参考にしてもらえれば・・・。
解決できそうな予感

編集 削除
GOUF  2005-04-21 08:22:50  No: 89490  IP: [192.*.*.*]

さささんありがとうございます。

とりあえず
CurrencyManager.ItemChanged 
DataView.ListChanged 
で試してみました。


Dim myCurrencyManager As CurrencyManager
Dim bc As BindingContext


Private Shared Sub OnSort(ByVal sender As Object, ByVal args As System.ComponentModel.ListChangedEventArgs)
    Console.WriteLine("OnSort!" + Now)
End Sub

Private Shared Sub OnSort2(ByVal sender As Object, ByVal args As System.Windows.Forms.ItemChangedEventArgs)
    Console.WriteLine("OnSort2!" + Now)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    AddHandler dv.ListChanged, New System.ComponentModel.ListChangedEventHandler(AddressOf OnSort)
    ' tsv形式のファイルを読み込みDataTableを作成するメソッド
    makeDataSet(vbTab)
    myCurrencyManager = CType(Me.BindingContext(DataGrid1.DataSource), CurrencyManager)
    AddHandler myCurrencyManager.ItemChanged, New System.Windows.Forms.ItemChangedEventHandler(AddressOf OnSort2)
End Sub

こんな感じのソースです。
しかしデータ読み込み時とカラムの変更時に[onsort!]は表示されますが
ソート時には表示されません。
また、[onsort2!]はどんなときも表示されませんでした。

(ちなみにBindingContext.CurrentChangedはBindingContextの取得方法が
わからなかったために試せていません。)

3種のイベントが発生しているとこのとですが、
どれか1つでも成功すれば、それで私の希望は達成します。

どこか記述が悪いところがあるのでしょうがわかりません。
ご指摘よろしくお願いします。

編集 削除
GOUF  2005-04-23 11:13:13  No: 89491  IP: [192.*.*.*]

ようやく解決できました。
BindingContextの取得方法もしくは取得先がよくなかったようです。
検索用に結果を記述しておきます。


以下のソースで、DataGridの「何か」(ソート、カレント行、内容等)
が変化するとそのイベントを取得する事ができました。

Private Sub OnSort(ByVal sender As Object, ByVal args As EventArgs)
    Console.WriteLine("OnSort!" + Now)
End Sub

AddHandler BindingContext(DataGrid.DataSource, "FileDataSet").CurrentChanged, New EventHandler(AddressOf OnSort)
もしくは
AddHandler BindingContext(DataGrid.DataSource, "FileDataSet").PositionChanged, New EventHandler(AddressOf OnSort)

それにしても…この辺の操作は難しいですね…
さささんありがとうございました。

編集 削除
ささ  2005-04-23 19:36:43  No: 89492  IP: [192.*.*.*]

ん〜、解決して何より。
自分このあたりで処理を考えてた時、
2晩ほど泊り込んだ時がありました。

編集 削除