tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridViewにカーソルを位置づけたい
記事No7979
投稿日: 2008/08/21(Thu) 15:10
投稿者不二子
DataGridViewについてご教授お願いします。
現在フォーム1に検索用のTEXTBOXとDataGridViewがあり、
DataGridViewにはAテーブルのデータを表示しています。
表示している内容は、社員コード、社員名、社員名カナです。
やりたいことは、検索用のTEXTBOXに”社員カナ”を入力した時に、そのレコードに
カーソルを位置づけたいのですが、どうすればよいかわかりません。

現在記述しているコードは下記の通りです。よろしくお願いいたします。

    Private Sub TXT_検索_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TXT_検索.KeyDown

        Dim strsql As String
        Dim strCode As String

        If e.KeyCode = Keys.Enter Then

            Try
                Dim command As New SqlClient.SqlCommand

                '---コネクションの指定
                command.Connection = Con

                '---コマンドの種類をテキストにする
                command.CommandType = CommandType.Text

                '---実行するSQLを指定
                strsql = "SELECT"
                strsql = strsql & " 社員コード"
                strsql = strsql & " FROM T社員テーブル"
                strsql = strsql & " WHERE 社員カナ Like '" & TXT_検索.Text & "%" & "'"

                command.CommandText = strsql

                '---SQLの結果を取得する
                Dim sr As SqlClient.SqlDataReader
                sr = command.ExecuteReader()
                command.Dispose()

                '---取得データ0件の場合は
                If Not sr.HasRows Then
                    MessageBox.Show("該当データがありません")
                    Exit Try
                Else
                    While sr.Read
                        strCode = sr("社員コード").ToString()
                    End While
                End If
                sr.Close()

                '---行番号取得
        ???

                '---カーソルの位置付け
                ???

            Finally
                MessageBox.Show("例外発生")
            End Try

        End If

    End Sub

[ツリー表示へ]
タイトルRe: DataGridViewにカーソルを位置づけたい
記事No7980
投稿日: 2008/08/21(Thu) 19:58
投稿者るしぇ
検索条件に入力データを渡してるのに、何がそのレコードなの?
全部該当するレコードじゃないの?

ま、とりあえず、カーソルの位置は CurrentCell を設定すれば
変更できますけど。

[ツリー表示へ]
タイトルRe^2: DataGridViewにカーソルを位置づけたい
記事No7984
投稿日: 2008/08/22(Fri) 10:50
投稿者不二子
> 検索条件に入力データを渡してるのに、何がそのレコードなの?
> 全部該当するレコードじゃないの?
すみません。説明がわかりずらいですね。
やりたいことは、DataGridViewに下記のようにデータが表示されています。

社員コード 社員氏名 社員カナ
001     一郎   イチロウ
002     二郎   ジロウ
003     三郎   サブロウ

そこでテキストボックスに"002"と入れられたらDataGridView上の"002"の行に
カーソルを位置づけたいということです。

るしぇさんのおかげで、位置付方法はわかりました。
GridView1.CurrentCell = GridView1.Rows(i).Cells(0)
って記述すればいいんですよね。
そこで、あと一息なんですが、Rows(i)のiの値を取得する方法を教えて下さい。
お願いします。

[ツリー表示へ]
タイトルRe^3: DataGridViewにカーソルを位置づけたい
記事No7985
投稿日: 2008/08/22(Fri) 11:06
投稿者魔界の仮面弁士
> そこでテキストボックスに"002"と入れられたらDataGridView上の"002"の行に
> カーソルを位置づけたいということです。

これで良いのかな。


Public Class Form1
 Private table1 As DataTable = CreateSample()

 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
  DataGridView1.MultiSelect = False
  DataGridView1.DataSource = table1
  TextBox1.ImeMode = System.Windows.Forms.ImeMode.Disable
  ActiveControl = TextBox1
 End Sub

 'Private Sub TextBox1_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.Validated
 Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.TextChanged
  Dim findRow As DataRow = table1.Rows.Find(TextBox1.Text)
  If findRow Is Nothing Then
   '該当データなし: 選択解除
   DataGridView1.ClearSelection()
   '該当データなし: 新規行に移動
   'DataGridView1.CurrentCell = DataGridView1(0, DataGridView1.NewRowIndex)
   Return
  End If

  For Each dgvRow As DataGridViewRow In DataGridView1.Rows
   Dim row As DataRow = DirectCast(dgvRow.DataBoundItem, DataRowView).Row
   If row Is findRow Then
    dgvRow.Selected = True
    Return
   End If
  Next
 End Sub

 Friend Shared Function CreateSample() As DataTable
  Dim tbl As New DataTable("Table1")
  tbl.Columns.Add("社員コード")
  tbl.Columns.Add("社員氏名")
  tbl.Columns.Add("社員カナ")
  tbl.PrimaryKey = New DataColumn() {tbl.Columns("社員コード")}
  tbl.Rows.Add("001", "一郎", "イチロウ")
  tbl.Rows.Add("002", "二郎", "ジロウ")
  tbl.Rows.Add("003", "三郎", "サブロウ")
  tbl.AcceptChanges()
  Return tbl
 End Function
End Class

[ツリー表示へ]
タイトルRe^4: DataGridViewにカーソルを位置づけたい
記事No7990
投稿日: 2008/08/22(Fri) 12:35
投稿者不二子
すみません。もう少し教えて下さい。
後、行番号さえ取得できればできそうなんですが、魔界の仮面弁士さんに教えてもらったようにしようとしたのですが、
Dim findRow As DataRow = table1.Rows.Find(TextBox1.Text)
のtable1のところをどのように置き換えればよいかわかりません。
よろしくお願いします。
尚、私のコーディングは下記の通りです。

<DataGridViewにまず、データをセット>
        Try
            '---抽出クエリ作成
            strsql = "SELECT"
            strsql = strsql & " 社員コード,"
            strsql = strsql & " 社員氏名,"
            strsql = strsql & " 社員カナ"
            strsql = strsql & " FROM T社員テーブル
            '---SQL文を作成して実行する
            Dim comm As SqlCommand = New SqlCommand(strsql, Con)
            '---SQL文を引数にしてデータアダプタを生成
            Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)
            '---DataAdapter で取得するデータの受け皿を準備
            Dim ds As DataSet = New DataSet()
            '---SQL 文を発行し、取得したデータを DataSet に格納
            dataadapter.Fill(ds, "社員テーブル")
            '---DataSet を DataGridView control と連結
            dgrSyain.DataSource = ds
            '---データソースの名前を設定
            dgrSyain.DataMember = "社員テーブル"
        Catch oExcept As Exception
            '例外が発生した時の処理
            MessageBox.Show(oExcept.ToString, "例外発生")
            Exit Sub
        End Try

<テキストボックスに検索時のイベント>
Private Sub TXT_検索_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TXT_検索.KeyDown

        Dim strsql As String
        Dim strCode As String
    dim rowIndex as integer

        If e.KeyCode = Keys.Enter Then
            Try
                Dim command As New SqlClient.SqlCommand
                '---コネクションの指定
                command.Connection = Con
                '---コマンドの種類をテキストにする
                command.CommandType = CommandType.Text
                '---実行するSQLを指定
                strsql = "SELECT"
                strsql = strsql & " 社員コード"
                strsql = strsql & " FROM T社員テーブル"
                strsql = strsql & " WHERE 社員カナ Like '" & TXT_検索.Text & "%" & "'"
                command.CommandText = strsql
                '---SQLの結果を取得する
                Dim sr As SqlClient.SqlDataReader
                sr = command.ExecuteReader()
                command.Dispose()
                '---取得データ0件の場合は
                If Not sr.HasRows Then
                    MessageBox.Show("該当データがありません")
                    Exit Try
                Else
                    While sr.Read
                        strCode = sr("社員コード").ToString()
                    End While
                End If
                sr.Close()

                '---行番号取得
        rowIndex=???

                '---カーソルの位置付け
                dgrSyain.CurrentCell = dgrSyain.Rows(rowIndex).Cells(0)
            Finally
                MessageBox.Show("例外発生")
            End Try

        End If

    End Sub

[ツリー表示へ]
タイトルRe^5: DataGridViewにカーソルを位置づけたい
記事No7991
投稿日: 2008/08/22(Fri) 13:41
投稿者るしぇ
>後、行番号さえ取得できればできそうなんですが、
弁さんのコードは行番号の取得ではなく、行オブジェクトが一致しますよ
ってことだと思いますが。。。

 DirectCast(dgrSyain.DataSource, DataSet).Tables("社員テーブル")
かな。

[ツリー表示へ]
タイトルRe^6: DataGridViewにカーソルを位置づけたい
記事No7992
投稿日: 2008/08/22(Fri) 14:30
投稿者不二子
下記のようにしたのですが、エラーとなります。
エラー:型'System.Data.DataTable'の値を'Integer'に変換できません。
全然とんちんかんなことをしているんでしょうか?

'---行番号取得
Dim rowIndex As integer
rowIndex = DirectCast(dgrSyain.DataSource, DataSet).Tables("社員テーブル")

---カーソルの位置付け
dgrSyain.CurrentCell = dgrSyain.Rows(rowIndex).Cells(0)

[ツリー表示へ]
タイトルRe^7: DataGridViewにカーソルを位置づけたい
記事No7993
投稿日: 2008/08/22(Fri) 14:35
投稿者るしぇ
> 全然とんちんかんなことをしているんでしょうか?
してますね。既に説明もしてますが、行番号取得のためのコードではありませんので。

> Dim findRow As DataRow = table1.Rows.Find(TextBox1.Text)
> のtable1のところをどのように置き換えればよいかわかりません。
Dim findRow As DataRow = DirectCast(dgrSyain.DataSource, DataSet).Tables("社員テーブル").Rows.Find(TextBox1.Text)

[ツリー表示へ]
タイトルRe^8: DataGridViewにカーソルを位置づけたい
記事No7994
投稿日: 2008/08/22(Fri) 15:10
投稿者不二子
ありがとうございます。
なんとかコンパイルが通るところまでいきました。
ですが、実行すると主キーのエラーがでます。
T社員テーブルの社員コードは主キーに設定されているんですが…
これはなぜなんでしょうか?

"System.Data.MissingPrimaryKeyException: テーブルに主キーがありません。
   場所 System.Data.DataTable.FindByPrimaryKey(Object value)
   場所 System.Data.DataRowCollection.Find(Object key)
   場所 TESTPG.frm社員一覧.TXT_検索_KeyDown(Object sender, KeyEventArgs e) 場所 C:\TEST\TESTPG\TESTPG\frm社員一覧.vb:行 399"

[ツリー表示へ]
タイトルRe^9: DataGridViewにカーソルを位置づけたい
記事No7995
投稿日: 2008/08/22(Fri) 16:16
投稿者るしぇ
主キーであるとか、フィールドのデータベース側の型とかデータサイズとか、
一般にスキーマ情報と呼ばれるものが取得できていないのか、取得していないのか。
はたまたそのあたりに不具合があって DataTable に設定できていないのか。

ただ、こまごまとした設定情報が取得しないデフォルト設定であることは考え
られるけど、主キーの情報は取れてたように思うけどなー。リンクテーブルだと
スキーマ情報が丸々取得できないとかいうバグも過去あったけど。。。
まー、データベースの設定を変更したり、取得できた DataSet の情報を調査
しないとボクには分かりませんね。

設定されていないというのだから設定されていないのでしょう。
DataTable は非連結型で設計されています。データベースと切り離されているので
そのまま使い捨てること前提に主キーをコードから設定すればいいと思います。
対処療法というか、応急手当ですけど。エラーの原因は色々と設定を変えて
調べてください。

しかし、ここまでくると DataGridView のセル値を上から1つ1つ取り出して
比較したほうが話が早そうですが。

[ツリー表示へ]
タイトルRe^9: DataGridViewにカーソルを位置づけたい
記事No7996
投稿日: 2008/08/22(Fri) 16:41
投稿者魔界の仮面弁士
> なんとかコンパイルが通るところまでいきました。
> ですが、実行すると主キーのエラーがでます。
DataSet へのデータの格納は、どのように行っていますか?

> T社員テーブルの社員コードは主キーに設定されているんですが…
データベース側に設定しただけで、肝心の DataTable の
PrimaryKey プロパティが、未設定だったりしませんか?

TableAdapter を使っているのであれば、型付きDataSet のテーブルに、
キー設定が行われているかどうか、デザイナ上でチェックしてみてください。

[ツリー表示へ]
タイトルRe^10: DataGridViewにカーソルを位置づけたい
記事No7997
投稿日: 2008/08/22(Fri) 16:56
投稿者るしぇ
> DataSet へのデータの格納は、どのように行っていますか?
記事No : 7990 の前半部がそうだと思いますよ。

SqlDataAdapter.Fill で DataSet に格納してるから、取得できても
不思議じゃないと思っているのですが。

[ツリー表示へ]
タイトルRe^11: DataGridViewにカーソルを位置づけたい
記事No8009
投稿日: 2008/08/25(Mon) 09:53
投稿者るしぇ
主キーが設定されているか確認して、
[DataTable.PrimaryKey プロパティ]
http://msdn.microsoft.com/ja-jp/library/system.data.datatable.primarykey(VS.80).aspx

関連リンク読んでると、FillSchema しないと主キー情報は取得できないようです。
[DbDataAdapter.FillSchema メソッド (DataSet, SchemaType, String)]
http://msdn.microsoft.com/ja-jp/library/0te8fa0y(VS.80).aspx

[ツリー表示へ]
タイトルRe^12: DataGridViewにカーソルを位置づけたい
記事No8010
投稿日: 2008/08/25(Mon) 10:56
投稿者不二子
何度もありがとうございます。
私も関連リンクを探していると下記のページを見つけました。
http://support.microsoft.com/default.aspx?scid=kb;ja;310128

そこで、FillSchemaを早速使用してみたんですが、なぜか"テーブルに主キーがありません"
とエラーになりました。
MissingSchemaAction プロパティに AddWithKey 列挙を使用下場合は、このエラーにはなりませんでしたが、findRow できませんでした。
記述方法が悪いのでしょうか?

もう一度コーディングを記述させていただきます。
<フォームのDataGridViewにデータを表示する時>
    Private Sub BTN_表示ボタン_Click(ByVal sender As System.Object, _
                                     ByVal e As System.EventArgs) Handles BTN_検索ボタン.Click
        Dim strsql As String
        Try
            '---抽出クエリ作成
            strsql = "SELECT"
            strsql = strsql & " 社員コード,"
            strsql = strsql & " 社員氏名,"
            strsql = strsql & " 社員カナ"
            strsql = strsql & " FROM T社員テーブル
            '---SQL文を作成して実行する
            Dim comm As SqlCommand = New SqlCommand(strsql, Con)
            '---SQL文を引数にしてデータアダプタを生成
            Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)
            
            '''---■DataSet オブジェクトの更新や検証に必要な追加のスキーマを取得する
            '''dataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey

            '---DataAdapter で取得するデータの受け皿を準備
            Dim ds As DataSet = New DataSet()

            '---■DataSet にスキーマを格納
            dataadapter.FillSchema(ds, SchemaType.Source, "社員コード")

            '---SQL 文を発行し、取得したデータを DataSet に格納
            dataadapter.Fill(ds, "社員テーブル")
            '---DataSet を DataGridView control と連結
            dgrSyain.DataSource = ds
            '---データソースの名前を設定
            dgrSyain.DataMember = "社員テーブル"
        Catch oExcept As Exception
            '例外が発生した時の処理
            MessageBox.Show(oExcept.ToString, "例外発生")
            Exit Sub
        End Try
    End Sub

<氏名カナで検索する時>
    Private Sub TXT_検索_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TXT_検索.KeyDown
        Dim strsql As String
        Dim strCode As String
        If e.KeyCode = Keys.Enter Then
            Try
                Dim command As New SqlClient.SqlCommand
                '---コネクションの指定
                command.Connection = Con
                '---コマンドの種類をテキストにする(省略可)
                command.CommandType = CommandType.Text
                '---実行するSQLを指定
                strsql = "SELECT"
                strsql = strsql & " 社員コード"
                strsql = strsql & " FROM T社員テーブル"
                strsql = strsql & " WHERE 社員カナ Like '" & TXT_検索.Text & "%" & "'"
                command.CommandText = strsql
                '---SQLの結果を取得する
                Dim sr As SqlClient.SqlDataReader
                sr = command.ExecuteReader()
                command.Dispose()
                '---取得データ0件の場合は
                If Not sr.HasRows Then
                    MessageBox.Show("該当データがありません")
                    Exit Try
                Else
                    While sr.Read
                        strCode = sr("社員コード").ToString()
                    End While
                End If
                sr.Close()
                '---DataTable 内のデータ行取得
                Dim findRow As DataRow = _
                    DirectCast(dgrSyain.DataSource, DataSet).Tables("社員テーブル").Rows.Find("& strCode &")
                '---カーソルの位置付け
                For Each dgvRow As DataGridViewRow In dgrSyain.Rows
                    Dim row As DataRow = DirectCast(dgvRow.DataBoundItem, DataRowView).Row
                    If row Is findRow Then
                        dgvRow.Selected = True
                        Return
                    End If
                Next
            Catch oExcept As Exception
                '例外が発生した時の処理
                MessageBox.Show(oExcept.ToString, "例外発生")
            End Try
        End If
    End Sub

[ツリー表示へ]
タイトルRe^13: DataGridViewにカーソルを位置づけたい
記事No8011
投稿日: 2008/08/25(Mon) 16:05
投稿者不二子
るしぇさん、魔界の仮面弁士さん無事解決できました!!!
データの行取得をFindできなかったのは、変数の書き方が間違っていたためでした。
下記のとおり修正することで出来ました。ありがとうございました。

Dim strCode As String

Dim strCode As String = Nothing

Dim findRow As DataRow = _
    DirectCast(dgrSyain.DataSource, DataSet).Tables("社員テーブル").Rows.Find("& strCode &")

Dim findRow As DataRow = _
    DirectCast(dgrSyain.DataSource, DataSet).Tables("社員テーブル").Rows.Find(strCode)

[ツリー表示へ]