|
■No75342 (優希(ゆき) さん) に返信
> DataGridViewにMySQLのテーブルのデータをValueMemberとDisplayMemberに入れて、選択させています。
> そのデータをDBにインサートして、再表示する際にインサートしたテーブルのデータを使用して、ComboBoxを選択させる方法を教えて下さい。
初回表示は出来ていて、再表示だけできないということでしょうか。
状況が良く分からないので、現状のコードを提示していただけませんか?
DataGridView へのバインドには、DataSet(あるいは DataTable, DataView)をお使いかと思いますが、
画面側とやりとりするのは、あくまでもその DataSet ですよね。
元データが CSV であろうと MySQL であろうと、DataGridView 側から見れば同じものですし、
そのデータが初回表示なのか再表示なのかも特に関係ない気がします。
もし、初回表示は問題ないのに、再表示時に反映されないという状況であれば、
DataSource プロパティをもう一度セットしなおしてみると良いかもしれません。
> ComboBoxを選択させる方法を教えて下さい。
こういうことで良いのかな…。
下記ではサンプル提供の都合上、コントロールの作成や設定を
コードで記載していますが、デザイン時に行っておいても OK です。
Partial Public Class Form1
Inherits System.Windows.Forms.Form
WithEvents btn1 As New Button()
WithEvents btn2 As New Button()
WithEvents dgv As New DataGridView()
WithEvents ds As New DataSet()
WithEvents bnd As New BindingSource()
''' <summary>
''' 2行目の出身地ComboBoxを徳島県にするボタン
''' </summary>
Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click
dgv("出身地列", 1).Value = 36
'上記だと、DataGridView の現在の並び順で処理されます。
'画面上のソート順によらず編集したい場合は、DataTable の値を直接更新してください
End Sub
''' <summary>
''' 新たな行を追加するボタン
''' </summary>
Private Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click
ds.Tables("出身一覧").Rows.Add(1200, "家康", 23)
'↑ BindingSource を経由している場合は BindingSource の AddNew メソッドでも可
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Shown
ds = CreateSampleData()
bnd.DataSource = ds
bnd.DataMember = "出身一覧"
bnd.Sort = "ID"
InitColumnSettings()
dgv.Dock = DockStyle.Fill
dgv.AutoGenerateColumns = False
dgv.EditMode = DataGridViewEditMode.EditOnEnter
dgv.DataSource = bnd 'BindingSource を経由させるかどうかはお好みで
dgv.DataMember = ""
Controls.Add(dgv)
btn2.Dock = DockStyle.Top
btn2.Text = "新たな行を追加するボタン"
btn2.Height = 40
Controls.Add(btn2)
btn1.Dock = DockStyle.Top
btn1.Text = "2行目の出身地ComboBoxを徳島県にするボタン"
btn1.Height = 40
Controls.Add(btn1)
ActiveControl = btn1
End Sub
''' <summary>
''' サンプルデータ
''' </summary>
Private Function CreateSampleData() As DataSet
Dim dsSample As New DataSet()
Dim tblAnswer As DataTable = dsSample.Tables.Add("都道府県")
tblAnswer.PrimaryKey = New DataColumn() {tblAnswer.Columns.Add("CD", GetType(Integer))}
tblAnswer.Columns.Add("県名")
tblAnswer.Rows.Add(13, "東京都")
tblAnswer.Rows.Add(23, "愛知県")
tblAnswer.Rows.Add(36, "徳島県")
tblAnswer.Rows.Add(37, "香川県")
tblAnswer.Rows.Add(40, "福岡県")
Dim tblBirthplace As DataTable = dsSample.Tables.Add("出身一覧")
tblBirthplace.PrimaryKey = New DataColumn() {tblBirthplace.Columns.Add("ID", GetType(Integer))}
tblBirthplace.Columns.Add("名前")
tblBirthplace.Columns.Add("出身地", GetType(Integer))
tblBirthplace.Rows.Add(1000, "秀吉", 23)
tblBirthplace.Rows.Add(2000, "卑弥呼", 40)
tblBirthplace.Rows.Add(3000, "空海", 37)
tblBirthplace.Rows.Add(4000, "漱石", 13)
'リレーションシップはあってもなくても良い
dsSample.Relations.Add(tblAnswer.Columns("CD"), tblBirthplace.Columns("出身地"))
dsSample.AcceptChanges()
Return dsSample
End Function
''' <summary>
''' 各列へのデータバインド設定
''' </summary>
Private Sub InitColumnSettings()
Dim colText As DataGridViewTextBoxColumn
Dim colCombo As DataGridViewComboBoxColumn
dgv.Columns.Clear()
dgv.AutoGenerateColumns = False
colText = New DataGridViewTextBoxColumn()
colText.Name = "ID列"
colText.HeaderText = "番号"
colText.DataPropertyName = "ID"
colText.Width = 40
dgv.Columns.Add(colText)
colText = New DataGridViewTextBoxColumn()
colText.Name = "名前列"
colText.HeaderText = "偉人"
colText.DataPropertyName = "名前"
colText.Width = 70
dgv.Columns.Add(colText)
colCombo = New DataGridViewComboBoxColumn()
colCombo.Name = "出身地列"
colCombo.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing
colCombo.ValueMember = "CD"
colCombo.DisplayMember = "県名"
colCombo.DataSource = ds.Tables("都道府県")
colCombo.HeaderText = "出身"
colCombo.DataPropertyName = "出身地"
colCombo.Width = 75
dgv.Columns.Add(colCombo)
End Sub
End Class
|