C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: DataGridViewのComboBoxでデータ選択


(過去ログ 127 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■75342 / inTopicNo.1)  DataGridViewのComboBoxでデータ選択
  
□投稿者/ 優希(ゆき) (70回)-(2015/03/17(Tue) 17:58:45)

分類:[.NET 全般] 

環境 Win7
言語 vb2005

DataGridViewにMySQLのテーブルのデータをValueMemberとDisplayMemberに入れて、選択させています。

そのデータをDBにインサートして、再表示する際にインサートしたテーブルのデータを使用して、ComboBoxを選択させる方法を教えて下さい。

DataPropertyNameではエラーが発生し、ValueMemberでは選択されませんでした。


引用返信 編集キー/
■75343 / inTopicNo.2)  Re[1]: DataGridViewのComboBoxでデータ選択
□投稿者/ WebSurfer (526回)-(2015/03/17(Tue) 19:15:28)
No75342 (優希(ゆき) さん) に返信
> DataGridViewにMySQLのテーブルのデータをValueMemberとDisplayMemberに入れて、選択させています。
>
> そのデータをDBにインサートして、再表示する際にインサートしたテーブルのデータを使用して、ComboBoxを選択させる方法を教えて下さい。

具体的にどのようにしたいのか、何が問題なのかよく分かりませんが・・・

以下のページが参考になりませんか?

DataGridView に ComboBox を表示
http://surferonwww.info/BlogEngine/post/2014/01/23/how-to-show-combobox-column-in-datagridview.aspx

DB は MySQL ではなく SQL Server ですが基本的なところは変わらないはずです。
引用返信 編集キー/
■75344 / inTopicNo.3)  Re[2]: DataGridViewのComboBoxでデータ選択
□投稿者/ yu (1回)-(2015/03/18(Wed) 01:01:14)
No75343 (WebSurfer さん) に返信
> ■No75342 (優希(ゆき) さん) に返信
>>DataGridViewにMySQLのテーブルのデータをValueMemberとDisplayMemberに入れて、選択させています。
>>
>>そのデータをDBにインサートして、再表示する際にインサートしたテーブルのデータを使用して、ComboBoxを選択させる方法を教えて下さい。
>
> 具体的にどのようにしたいのか、何が問題なのかよく分かりませんが・・・
>
> 以下のページが参考になりませんか?
>
> DataGridView に ComboBox を表示
> http://surferonwww.info/BlogEngine/post/2014/01/23/how-to-show-combobox-column-in-datagridview.aspx
>
> DB は MySQL ではなく SQL Server ですが基本的なところは変わらないはずです。
引用返信 編集キー/
■75345 / inTopicNo.4)  Re[2]: DataGridViewのComboBoxでデータ選択
□投稿者/ 優希(ゆき) (71回)-(2015/03/18(Wed) 09:49:19)
No75343 (WebSurfer さん) に返信
> ■No75342 (優希(ゆき) さん) に返信
>>DataGridViewにMySQLのテーブルのデータをValueMemberとDisplayMemberに入れて、選択させています。
>>
>>そのデータをDBにインサートして、再表示する際にインサートしたテーブルのデータを使用して、ComboBoxを選択させる方法を教えて下さい。
>
> 具体的にどのようにしたいのか、何が問題なのかよく分かりませんが・・・
>
> 以下のページが参考になりませんか?
>
> DataGridView に ComboBox を表示
> http://surferonwww.info/BlogEngine/post/2014/01/23/how-to-show-combobox-column-in-datagridview.aspx
>
> DB は MySQL ではなく SQL Server ですが基本的なところは変わらないはずです。

わかりにくくてすみません。

DataGridViewでは、DataPropertyNameを設定すると、DataTableのデータを表示できますが、列をComboBoxにした場合に、同じような方法で表示することが可能か?との内容になります。
引用返信 編集キー/
■75346 / inTopicNo.5)  Re[3]: DataGridViewのComboBoxでデータ選択
□投稿者/ shu (721回)-(2015/03/18(Wed) 09:57:58)
No75345 (優希(ゆき) さん) に返信
> わかりにくくてすみません。
>
> DataGridViewでは、DataPropertyNameを設定すると、DataTableのデータを表示できますが、列をComboBoxにした場合に、同じような方法で表示することが可能か?との内容になります。

DataPropertyNameはセルに表示する内容でありComboBoxのドロップダウンリストの内容は通常のコンボボックスと
ほぼ同じようにItems,DataSource,ValueMember,DisplayMemberを使用します。ただDataGridViewComboBoxの
プロパティとして設定すると列全体の設定になるので個々に設定する場合はCell単位での設定が必要となります。


No75343でWebSurfer さんが提示をしている内容があるのだからそれに対し試行し思考した結果を回答された方がよろしいかと思います。
引用返信 編集キー/
■75347 / inTopicNo.6)  Re[4]: DataGridViewのComboBoxでデータ選択
□投稿者/ 優希(ゆき) (72回)-(2015/03/18(Wed) 10:20:59)
No75346 (shu さん) に返信
> ■No75345 (優希(ゆき) さん) に返信
>>わかりにくくてすみません。
>>
>>DataGridViewでは、DataPropertyNameを設定すると、DataTableのデータを表示できますが、列をComboBoxにした場合に、同じような方法で表示することが可能か?との内容になります。
>
> DataPropertyNameはセルに表示する内容でありComboBoxのドロップダウンリストの内容は通常のコンボボックスと
> ほぼ同じようにItems,DataSource,ValueMember,DisplayMemberを使用します。ただDataGridViewComboBoxの
> プロパティとして設定すると列全体の設定になるので個々に設定する場合はCell単位での設定が必要となります。
>
>
> No75343でWebSurfer さんが提示をしている内容があるのだからそれに対し試行し思考した結果を回答された方がよろしいかと思います。

ComboBoxにデータを入れて表示させるのは出来ていますが…?

引用返信 編集キー/
■75348 / inTopicNo.7)  Re[3]: DataGridViewのComboBoxでデータ選択
□投稿者/ WebSurfer (527回)-(2015/03/18(Wed) 10:46:27)
No75345 (優希(ゆき) さん) に返信

直接の回答は shu さんがされているのでそれを見ていただくとして、その前
に Visual Studio を使ってデータベースの更新を行うための Windows Forms
アプリの基本を知っておかないと話が通じにくいので、それを理解しておく
ことをお勧めします。

Visual Studio の「データソース構成ウィザード」を利用してアプリを作ると、
自分では一行もコードを書かなくても以下のページの図にある構成のアプリを
作成できます。

Visual Studio でのデータへの接続の概要
https://msdn.microsoft.com/ja-jp/library/wxt2cwcc(VS.80).aspx

> DataGridViewでは、DataPropertyNameを設定すると、

という文章から想像するに、自力で DataPropertyName を設定されているよう
ですが、それも Visual Studio のウィザードがやってくれます。具体的な手
順は以下のチュートリアルを見てください。

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://msdn.microsoft.com/ja-jp/library/0f92s97z(VS.80).aspx

先の私の回答で紹介した記事ではステップ 1 〜 7 が相当します。

これを基本に、特定の列(サンプルでは Category と Supplier)を ComboBox
で表示する手順がステップ 8 〜 22 です。

ステップ 8 〜 16 では、Category 列の ComboBox のデータソースに使う
DataTable を Visual Studio のウィザードを利用して作成しています。

ステップ 17 〜 22 では、Supplier 列の ComboBox のデータソースに使う
DataTable を自力で ADO.NET ライブラリを使って作成しています。
引用返信 編集キー/
■75349 / inTopicNo.8)  Re[5]: DataGridViewのComboBoxでデータ選択
□投稿者/ shu (722回)-(2015/03/18(Wed) 10:49:52)
No75347 (優希(ゆき) さん) に返信
> 
> ComboBoxにデータを入れて表示させるのは出来ていますが…?
> 
・・・を詳しく。?は何に対してなのかわかりません。


Column1はデザイナでDataGridViewComboBoxColumnとして作成済

        Dim tblCombo As New DataTable()
        With tblCombo.Columns
            .Add("col1")
            .Add("col2")
        End With

        tblCombo.Rows.Add("a", "Disp a")
        tblCombo.Rows.Add("b", "Disp b")
        tblCombo.Rows.Add("c", "Disp c")
        tblCombo.Rows.Add("d", "Disp d")

        Column1.DataPropertyName = "Col3"
        Column1.DataSource = tblCombo
        Column1.ValueMember = "col1"
        Column1.DisplayMember = "col2"

        Dim tbl2 As New DataTable()
        With tbl2.Columns
            .Add("Col3")
            .Add("Col4")
        End With
        tbl2.Rows.Add("a", "a1")
        tbl2.Rows.Add("b", "b1")
        tbl2.Rows.Add("a", "a2")
        tbl2.Rows.Add("c", "c1")
        tbl2.Rows.Add("d", "d1")
        DataGridView1.DataSource = tbl2

引用返信 編集キー/
■75351 / inTopicNo.9)  Re[1]: DataGridViewのComboBoxでデータ選択
□投稿者/ 魔界の仮面弁士 (242回)-(2015/03/18(Wed) 12:20:50)
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

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -