- PR -

DataGridの列からテキストボックスへ。

投稿者投稿内容
KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2003-02-28 13:22
はじめまして。初投稿です。
VB.NETを使用しての開発なのですが、DataGridに表示される列を選択して
同フォーム上のテキストボックスにそれぞれの値を飛ばす。
という方法で行き詰っています。

とても初歩的なものかと思いますが、どなたかご教授ください。

処理としては・・・
・フォームオンロードでDataGridにDBのリストを一括で表示

・DataGrid内の列を選択

・選択列の値がテキストボックスに代入される。
というものです。

なお、列選択後にボタンによる処理をはさむことも考えていますが、
できれば列選択時にテキストボックスに表示されるようにしたいです。
よろしくお願いします。
KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2003-02-28 18:05
すいません。質問の仕方に誤りがありました。
追記しますのでよろしくお願いします。

DataGridに配置されるオブジェクトはどれもTextBoxColumオブジェクトです。
DataSetにテーブル内容を入れて、DataViewと連結しています。
ただし、数あるオブジェクトのうち、実際に表示されるのは2つだけです。
他のオブジェクトは幅を0に設定して見えないようにしています。
で、DataGridの左端でカレントレコードを選択する部分があるかと思いますが、
その部分をクリックした場合に同じフォーム内に設置したオブジェクト分のテキストボックスで
選ばれたレコードのオブジェクトを全て参照するようなものを作りたいのです。

VB自体が入門者なもので、何かと無茶な質問なのかもしれませんが、参考になるサイトなどでもかまいませんので、どなたか助言お願いします。
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-02-28 20:10
MouseDownのHitTest メソッドを利用できます。

コード:
Private Sub DataGrid1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs)

 Dim hti As DataGrid.HitTestInfo = myGrid.HitTest(e.X, e.Y)

 If hti = DataGrid.HitTestType.RowHeader 
   txtboxA.text = datagrid1.Item(hti.row,0)
   txtboxB.text = datagrid1.Item(hti.row,1)
 End If



このような感じでしょうか。

>他のオブジェクトは幅を0に設定して見えないようにしています。

幅を0にしても矢印かTABで見えないセルに移りますよ。
KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2003-02-28 20:46
解答していただいて本当にありがとうございます。
上げてもらったコードの通りにやってみましたが、以下の部分でエラーが出ました。

txtboxA.text = datagrid1.Item(hti.row,0)
txtboxB.text = datagrid1.Item(hti.row,1)
エラー内容
 Option Strict On で'SystemObject'から'String'への暗黙的な変換はできません。

本当にわからないことだらけですいません。

また、自分の頭では関数や引数を使ってやるものだと思っていたのですが
それは見当違いになってくるのでしょうか?
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-02-28 21:46
>また、自分の頭では関数や引数を使ってやるものだと思っていたのですが
>それは見当違いになってくるのでしょうか?

関数や引数とはどんなイメージで言われていますでしょうか?

txtboxA.text = datagrid1.Item(hti.row,0).tostring

KIMERA
大ベテラン
会議室デビュー日: 2003/02/28
投稿数: 112
お住まい・勤務地: 兵庫県・大阪府
投稿日時: 2003-03-01 15:34
たびたびの返答ありがとうございます。

>関数や引数とはどんなイメージで言われていますでしょうか?
自分のイメージでは、DataGrid内の欲しい値を関数に放り込み、それをTextBoxに呼び出す。といったものを想像していたのですが・・・。

あと、「If hti = DataGrid.HitTestType.RowHeader」の部分なんですが、
演算子'='は、型'System.Windows.Forms.DataGrid.HitTestInfo'および'System.Windows.Form.DataGrid.HitTestType'に対して定義されてません。
というエラーが返ってきましたが、どのように解決すればいいのでしょうか?
NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2003-03-01 21:15
少し発想を変えてみてはいかがでしょうか。つまり、TextBoxもDataGridも同じ「データソース」からのデータを「表示するだけ」なのですから、表示されているものを流用して別の形態の表示を作るのではなく、同じデータソースに対して異なる表示方法をするという考え方はどうでしょうか。

そう考えると、アプリケーションで管理しなければならないのは、1) データの表示方法、2) データソースの現在行の管理、3) 現在行の更新時に表示を更新する仕組み、の3点になります。1はDataGridとTextBoxということでいいでしょう。2と3については、Windows Formsが持つデータ連結の機能を使えば、コーディングする必要はありません。

そういうわけで、次のようなコードでお望みの機能が実現できていると思います。
コード:
Imports System.Windows.Forms
Imports System.Data
Imports System.Data.SqlClient
Class Form1 : Inherits Form
  Shared Sub Main()
    Application.Run(New Form1())
  End Sub
  Private DataGrid1 As DataGrid
  Private TextBox1 As TextBox

  Sub New()
    DataGrid1 = New DataGrid()
    DataGrid1.Width = Me.Width
    DataGrid1.Height = Me.Height \ 2
    Controls.Add(DataGrid1)
    TextBox1 = New TextBox()
    TextBox1.Top = DataGrid1.Height
    Controls.Add(TextBox1)
  End Sub
  
  Private Sub Form1_Load(s As Object, e As EventArgs) Handles MyBase.Load
    Dim ds As New DataSet()
    Dim da As New SqlDataAdapter( _
        "select FirstName, LastName, HireDate FROM Employees", _
        "Server=.;Database=Northwind;Integrated Security=SSPI")
    da.Fill(ds, "Employees")

    DataGrid1.DataSource = ds
    DataGrid1.DataMember = "Employees"
    TextBox1.DataBindings.Add("Text", ds, "Employees.HireDate")
  End Sub
End Class

うりゅう
大ベテラン
会議室デビュー日: 2002/06/15
投稿数: 202
お住まい・勤務地: Hiroshima
投稿日時: 2003-03-02 09:14

NothingBut.NETFXさんの回答も、発想の転換という点でとても参考になるものだと
思うのですが、たまたまこの件に似たパターンのコーディングをしたことがありま
したので、記述します。

Togさんの書かれているMouseDownを使ったものですが、Togさんのサンプルは
抜粋を行われているようで足りない部分があります。そのため、自分のサンプルは
書いたままをそのまま記述しましたので(笑)、適宜置き直してください。

Private Sub Tgrid_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Tgrid.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
TView.RowFilter = "得意先ID='" & TID & "'"
Tanview.RowFilter = "担当者ID=" & TView(0)("担当者ID")
TXTAN.Text = Tanview(0)("担当者名")
End If

End Sub
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

一度、Senderから拾ってきたオブジェクトを仮のデータグリッドに繋げている
ところが問題なんだろうと思います。
_________________
--------------------------------------
ネットビルド 小田原貴樹
odahara@netbuiuld.jp
--------------------------------------

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