- PR -

VB.NET DataGrid内の検索について

投稿者投稿内容
KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2003-03-10 20:17
こんにちわ。
VB.NETにてWindowsアプリケーションの練習をしています。
先日、この場でたくさんの人からご指導・助言を頂き大変助かりました。

DataGridに番号と名前だけのButtonを1つずつ配置し、TextBoxより任意の番号を入力しButtonを押下することで、入力された番号のレコードがカレント行になるようにしようとしています。

コードは一応作成し、動作も確認できたのですが、ある処理を混ぜることでうまく動作しなくなりました。

ある操作というのはDataGridのMouceDownイベントにてクリックした行の番号を取得してTextBoxに表示するというものなのですが、このイベントを入れることでDataGridをマウスにてクリックした後は検索番号をカレントにするという処理がうまく動作してくれません。

わかりやすいように作成したコードを上げてみます。
===============================================================================
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim iFound As Integer

If TextBox3.Text = "" Then
MessageBox.Show("検索する番号を入力してください")
Return
End If

DataView1.Sort = "Num"
iFound = DataView1.Find(TextBox3.Text)

If iFound <> -1 Then
DataGrid1.CurrentRowIndex = iFound
Else
MessageBox.Show("該当する番号は見つかりませんでした")
End If
End Sub

Private Sub DataGrid1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGrid1.MouseDown
Dim myGrid As DataGrid = CType(sender, DataGrid)
Dim hti As System.Windows.Forms.DataGrid.HitTestInfo = myGrid.HitTest(e.X, e.Y)
Dim TID As String = "-1"

Select Case hti.Type
Case System.Windows.Forms.DataGrid.HitTestType.Cell

TID = myGrid.Item(hti.Row, 0)
myGrid.Select(hti.Row)

Case System.Windows.Forms.DataGrid.HitTestType.RowHeader
TID = myGrid.Item(hti.Row, 0)
End Select

If Not TID = "-1" Then
DataView1.RowFilter = "Num='" & TID & "'"
TextBox1.Text = DataView1(0)("Num")
End If
End Sub
===============================================================================
以上がコードなのですが、DataGridのMouceDownイベントを削除すると思い通りの動作でButton2_Clickイベントは処理されます。
思い通りにならない処理とは、DataGridのどこかをクリックした後だけ(DataGridをクリックする前は正常に動作します。)どんな該当番号を入力しても、カレントレコードにカーソルが移動せず、If文の「該当する番号はありません」という処理が返されてしまいます。

つまり、iFoundが-1で返されてこういった結果になっているわけですよね?どうしてこういう結果になるのか、またどうすれば修正されるのかわからずに困っています。

どなたかアドバイスをいただけませんか?
KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2003-03-12 10:32
こんにちわ。
なんとか自分でいろいろ手を尽くしているのですが、どうもうまく理解できません。
また、質問内容が伝わりきれてないような気がするので追記させてください。
(毎度すいません;;)

まず、フォーム構成から詳しく書かせていただきます。

VB.NETにてWindowsアプリケーションを作成。
フォーム上には
[TextBox1,2,3][Button1][DataGrid1]の5つのオブジェクトがあります。
それぞれはWindowsのコントロールから配置したものです。
DBにはMDBを使用し、データの接続にはデータリンクプロパティより「Microsoft Jet4.0 OLE DB Provider」を使用して接続し、データコントロールの「OleDbDataAdapter」のデータアダプタ構成ウィザードを使用しています。
[DataGrid]コントロールにはこの接続を利用したデータが表示されるようになっています。
今回使用するMDBのテーブルには"Num"という整数型のデータを"Name"という文字列型のデータのみが格納されています。
[TextBox1,2]はこの[DataGrid1]の行をクリックした場合に"Num"と"Name"がそれぞれに表示されるようにしています。
[TextBox3]には[DataGrid1]に並ぶ任意の"Num"を入力するようにし、[Button1]を押下することで入力された"Num"の行をカレントセルにし、ソートするようにしています。

上記のような動きを作っているのですが、前回の書き込み時のような処理になってしまっていて困っています。
また、自分でどういった場所を考え直していくのかも理解できずにいます。
前回の書き込みと少しかぶりますが、現状の動作としては
[DataGrid1]のMouceDownイベントは正常に動作。
[Button1]のClickイベントにおいて思い通りの処理ができません。
思い通りにならないというのは、該当の"Num"が[DataGrid1]内にあるにも関わらず、自分で作ったエラーに引っかかり、「該当番号がない。」といった処理が返されてしまうことです。
このエラーになる場合は決まって[DataGrid1]内のセルをクリックしてしまった後です。
[DataGrid1]に触れずに入力すると正常に処理がされるのですが・・・。
[DataGrid1]をクリックすることで自分の気づいていない処理がされているのでしょうか?
長々と書いてしまいましたが、どなたかお解かりの方がいればご教授ください。
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2003-03-12 17:04
こんにちは

私は基本的にWebアプリにしかVS.NETを使わないので的外れな気もしますが

>If Not TID = "-1" Then
>DataView1.RowFilter = "Num='" & TID & "'"
>TextBox1.Text = DataView1(0)("Num")
>End If

以上の行をコメントアウトしてみて、実行したらどんな結果になりますか。
もし、正常に動作されるようなら

>DataView1.RowFilter = "Num='" & TID & "'"

を疑った方がいいでしょう。Numが数値であるなら、シングルクォーテーションが
あるのも少し気になります。

もし、正常に動作しないようなら.....そんときはもう一度考えるというのでは
どうですか。
KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2003-03-12 17:22
べーちゃんさん、ありがとうございます。
ご指摘の部分をコメントアウトして実行してみたところ、Button_Clickのイベントに関しては問題なく動作しました。
当然かもしれませんが、その部分をコメントアウトするとDataGridのイベントは機能しなくなります。
つまり、ご指摘の通り「DataView1.RowFilter = "Num='" & TID & "'"」の部分を疑えということですかね。

自分で何度かデバッグして気づいたのですが、DataViewのFindメソッドでは、検索した値が見つからない場合にのみ戻り値を「-1」として返してくるのですが、コメントアウトする前のDataGridのどれかのセルをクリックしてしまうと、存在する値を入れてもFindの戻り値は「-1」となってしまいました。

べーちゃんさんに指摘された部分とどんな関連性があって戻り値が正常にならないのか、理解できませんがなんとかもう少しがんばってみます。
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-03-12 21:26
こんにちわ。
的はずれかもしれません。(^^;
ちょっと思ったことです。
RowFillterされたものにFindされているのなら-1が帰ってくるのは当然な気もします。
べーちゃん
大ベテラン
会議室デビュー日: 2002/07/21
投稿数: 121
投稿日時: 2003-03-13 03:45
>RowFilterされたものにFindされているのなら-1が帰ってくるのは当然な
>気もします。

その通りですね。
私がコメントする時点では他の要素も考えられないかと思ってif文全体を
コメントしてくださいと書きましたが、原因が

>DataView1.RowFilter = "Num='" & TID & "'"

に限定できるのであれば、あとは簡単です。
RowFilterをマニュアルをつかって調べれば、なぜエラーが発生したかを
理解できるはずです。
そしたら、解決策もすぐにわかるはずです。
KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2003-03-13 09:40
Togさん、べーちゃんさんありがとうございます。
ご指摘いただいたものをしっかり学習し理解しようと思います。
遅くなるかもしれませんが、結果を後ほどお知らせします
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-03-13 10:11
単純に

DataView1.Sort = "Num"
iFound = DataView1.Find(TextBox3.Text)

の部分を

DataView1.Sort = "Num"
DataView1.RowFilter = ""
iFound = DataView1.Find(TextBox3.Text)

と書き換えてあげればうまく動きませんか?

スキルアップ/キャリアアップ(JOB@IT)