DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Bindinsourceのカレント行とDatagridviewの選択行について

環境/言語:[WinXP/VB.net,Framwork2.0]
分類:[.NET]

2009/02/03(Tue) 14:21:10 編集(投稿者)

現在、マルチウィンドウシステムを構築中で、Datagridviewでクリックした時のイベント処理で困っております。
 
構成として・・・
メイン画面
└コンポーネント
  └Bindingsource
  └Bindingnavigatorを実装したフォーム
  └DataGridViewを実装したフォーム
となっております。
 
現象として・・・
@DataGridViewで行をクリック
Aカレント行変更(BindingSource.CurrentChanged)イベントが発生します。
B(BindingSource.CurrentChanged)イベント処理内で元の行に戻す処理をします。
  Bindingsource.Position = カレント行変更直前の行位置
CBindingsource.Positionは元の場所に戻ります。
DDataGridView.CurrentRow.Indexは変化なし。(クリック位置のまんまだったりします)
 
そこで・・・
”Bindingsource DataGridView カレント 同期”で、Googleって見たのですが、
「Bidingsourceは、DataGridView等の複数のコントロールでデータセットを共有する物」
といった内容ばかりで、なかなか見当たりません。
 
よく見かける様な処理と思いますが・・・
皆さんはどの様に回避または対応されて居られるのでしょうか?
 
ご教授の程、をお願い致します。
2009/02/03(Tue) 18:54:54 編集(投稿者)

とりあえずですが・・・
グリッド内をクリックした後の、「キャンセル」する(選択行を戻す)処理について
 DataGridViewをオーバーライドして、
  SetCurrentCellAddressCore
の動きを追っていきました。
ところ・・
 @セルをクリック
 ASetCurrentCellAddressCoreが呼出される
 BSetCurrentCellAddressCore内にて、BindingSourceのCurrentを変更
 CDataGridViewのいろいろなイベントが走る
 DSetCurrentCellAddressCoreの処理が終わる
 EDataGridView.SelectionChangedイベントが送信される
まで分かりました。
 
以下が”セルをクリックした”時の対応分です。
 
Imports System.Windows.Forms
 
Public Class BaseDataGridView
 
    Private _doCancel As Boolean = False
    Private _Position As New Point(-99, -99)
 
    Protected Overrides Function SetCurrentCellAddressCore( _
    ByVal columnIndex As Integer, _
    ByVal rowIndex As Integer, _
    ByVal setAnchorCellAddress As Boolean, _
    ByVal validateCurrentCell As Boolean, _
    ByVal throughMouseClick As Boolean _
    ) As Boolean
        If CurrentCell IsNot Nothing Then _Position = New Point(Me.CurrentCell.ColumnIndex, Me.CurrentCell.RowIndex)
        Return MyBase.SetCurrentCellAddressCore(columnIndex, rowIndex, setAnchorCellAddress, validateCurrentCell, throughMouseClick)
    End Function
 
    Public Sub doCancel()
        _doCancel = True
    End Sub
 
    Private Sub DataGridView_SelectionChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.SelectionChanged
        If Me.CurrentCell Is Nothing Then Exit Sub
 
        If _doCancel Then
            _doCancel = False
            Me.CurrentCell = Me(_Position.X, _Position.Y)
        End If
    End Sub
 
End Class
ソート時でのCurrentChangeイベントでは「キャンセル」とした場合、
BindingSourceにてその行を検索して、カレント行を移動する事にしました。

この時、BindingSource.カレント行とDataGridView.選択行は同時に反映されますので、当初の問題は無くなりました。

つきましては、解決済みとさせて頂きます。

有難う御座いました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板