DataGridViewで最終行を選択出来ない!


AYAKA  2008-08-16 06:05:34  No: 145094

こんばんは。
DataGridViewで最終行を選択出来なくて悩んでいます。

DataGridViewで1行選択し「削除」ボタンで論理削除(DELFLG=1をセットする)する
【例】
初期表示データが3件表示される
下から順番に選択して削除していく
すると1番目(最終行)、2番目(真ん中)は問題なく削除される
最後の行(先頭行)が選択出来なくなります。
(DataGridView1_RowEnter)イベントが発生しなく」なるみたいです!

なぜ、DataGridView1_RowEnterが発生しないのでしょうか?
他に行を選択したということがわかるイベントはあるのでしょうか?
よろしくお願いします。

【選択処理】
選択した行の内容を画面上のテキストエリアに表示している

Private Sub DataGridView1_RowEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.RowEnter
     If Me.DataGridView1.SelectedRows.Count > 0 Then
         Me.TextBox1.Text = Me.DataGridView1.Rows(e.RowIndex).Cells(0).FormattedValue
         Me.TextBox2.Text = Me.DataGridView1.Rows(e.RowIndex).Cells(2).FormattedValue
     End If
End Sub

【削除ボタン処理】
選択行のキーを元に検索し該当したデータに削除フラグをセットする
DataGridView1より選択データが消える

Dim Row As DataSet.Test_Row
Row = Dt.FindByNo(Index)
If Row Is Nothing Then
  MessageBox.Show("データを選択してください", "エラーメッセージ")
Else
    Row("DELFLG") = 1
End If

テーブルの参照方法は次のようにやっています。
DataSet
BindingSource
TableAdapter
DataGridViewにバインドしています。

【Form1.Load】データを取得して、フィルターをかける
Using Ta As New Test_DataSetTableAdapters.TestTableAdapter
        Dt = Ta.GetData()
End Using
TestBindingSource.DataSource = Dt
TestBindingSource.Filter = ("DELFLG = 0")

【Form1】
Private Dt As Test_DataSet.TestDataTable


AYAKA  2008-08-21 20:42:58  No: 145095

DataGridViewで選択行を取得する方法ですが
RowEnter以外になにかあるのでしょうか?

よろしくお願いします。


特攻隊長まるるう  2008-08-22 04:52:01  No: 145096

バージョン書いてないけど、固有のコードがあるから[VB2008]ですかねぇ。
新しい技術はノウハウの蓄積が少ないですから、回答も少ないでしょう。
そうなると自分で調べるしかないんですよね。

[VB2005]で RowEnter と "DELFLG" = 1 の処理だけ作ってみたけど、セル1個
選択の時には条件が揃わないから、TextBox は更新されず、動きがいまいちに
感じました。SelectionMode とかも変えてるんじゃないのかなぁ。。。
定義されてない変数もあるし。。。

よく分からなかったので。。。
[DataGridView メンバ]
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview_members.aspx
イベントを中心にそれらしいのを上から試していけばいいのでは?
単純に CurrentCellChanged でも SelectedRows を確認すれば
有効じゃないかと思うし、RowHeaderMouseClick とかも使えるかも
しれないね。SelectionChanged とか。


  2008-08-22 06:42:41  No: 145097

>RowEnter
>行が入力フォーカスを受け取り、現在の行になったときに発生します。 

イベント発生しなかった原因は
最後の1行 = 現在の行
のためイベントが発生しないのではないでしょうか?

Click系とかMouseDown(UP)あたりではどうですか?

#削除したときに現在選択されているRowのデータを表示する
#ってのでも回避できそうですが・・・。


AYAKA  2008-08-29 01:52:11  No: 145098

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

VS2005を使用しています。

>Click系とかMouseDown(UP)あたりではどうですか?

具体的にどのように記述するとよろしいのでしょうか?

よろしくお願いします。


AYAKA  2008-08-29 02:41:24  No: 145099

みなさん、お世話になります。 
Private Sub DataGridView1_MouseClickでやってみました。

 If Me.DataGridView1.SelectedRows.Count > 0 Then
         Me.TextBox1.Text = Me.DataGridView1.Rows(e.RowIndex).Cells(0).FormattedValue
         Me.TextBox2.Text = Me.DataGridView1.Rows(e.RowIndex).Cells(2).FormattedValue
     End If

「e.RowIndex」でエラーになります。
'System.Windows.Forms.MouseEventArgs' のメンバではありません。
どのように対処すればよろしいのでしょうか?


  2008-08-29 23:18:18  No: 145100

DataGridView1_CellMouseClick
の方ではだめですか?

DataGridView1.SelectionModeがFullRowSelectになっている時と
それ以外で少し動作が変わってしまいますが。


AYAKA  2008-08-30 03:06:00  No: 145101

「と」さんありがとうございます。
DataGridView1.SelectionModeがFullRowSelectです。

DataGridView1_CellMouseClickでやってみましたが
選択できない時があります。

同じような現象です。


AYAKA  2008-08-30 03:06:06  No: 145102

「と」さんありがとうございます。
DataGridView1.SelectionModeがFullRowSelectです。

DataGridView1_CellMouseClickでやってみましたが
選択できない時があります。

同じような現象です。


  2008-08-30 08:11:11  No: 145103

ブレークで
> If Me.DataGridView1.SelectedRows.Count > 0 Then
の所で止めてもイベントが発生しませんか?

今回のDataGridView1_CellMouseClickは
そもそも選択されたときですから
> If Me.DataGridView1.SelectedRows.Count > 0 Then
は抜いてますよね?
イベントが発生するかが鍵だと思うのです。

ごめんなさい
提示の情報だけだと同じ環境を完璧に再現できていないかも
しれません。
なんか*の行とか出てきてます。


KG  2008-08-30 09:32:05  No: 145104

>なんか*の行とか出てきてます。

AllowUserToAddRowsプロパティがTrueなんじゃないかしら。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加