vb.net Datagridview 下拉框应用

48 篇文章 1 订阅



    Public Class Form1


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Try
            Me.Cursor = Cursors.WaitCursor

            DataGridView1.AutoGenerateColumns = False


            Dim cmbInitData As DataTable = GetInitialComboBoxData()
            ' DataGridViewのコンボボックスの生成と初期化
            CreateGridOfComboBoxAndInitial(DataGridView1, cmbInitData, "value", "name", 1)

            ' グリッドデータの初期化
            Dim grdDataSource As DataTable = GetGridData()
            DataGridView1.DataSource = grdDataSource

            ' DBのValueにより、コンボボックス選択項目の設定
            SetGridCmbValueByDB(DataGridView1, grdDataSource, 1, 2)

        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        Finally
            Me.Cursor = Cursors.Default
        End Try
    End Sub


    ''' <summary>
    ''' グリッド初期化データの取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetGridData() As DataTable
        Dim conn As New ADODB.Connection
        Dim constr As String
        constr = ("Driver={SQL Server};server=xx-pc\SQLEXPRESS;Uid=xx;Pwd=xxxx;Database=TestDB")
        Dim Rec As New ADODB.Recordset
        Dim recordTable As New DataTable
        Dim ChangeDA As New OleDb.OleDbDataAdapter
        Dim sql As String

        conn.Open(constr)
        sql = "select * from GVTest"
        Rec.Open(sql, conn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic)
        ChangeDA.Fill(recordTable, Rec)
        Rec.Close()
        conn.Close()
        Return recordTable
    End Function


    ''' <summary>
    ''' グリッド内コンボボックス初期化データの取得
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetInitialComboBoxData() As DataTable
        Dim conn As New ADODB.Connection
        Dim constr As String
        Dim Rec As New ADODB.Recordset
        Dim recordTable As New DataTable
        Dim ChangeDA As New OleDb.OleDbDataAdapter
        Dim sql As String

        constr = ("Driver={SQL Server};server=xxx-pc\SQLEXPRESS;Uid=xx;Pwd=xxxx;Database=TestDB")
        conn.Open(constr)

        sql = "select value, name from Dictionary order by sortid"
        Rec.Open(sql, conn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic)
        ChangeDA.Fill(recordTable, Rec)
        Rec.Close()
        conn.Close()
        Return recordTable
    End Function


    ''' <summary>
    ''' グリッドにコンボボックスの生成とデータ初期化
    ''' </summary>
    ''' <param name="grd"></param>
    ''' <param name="dataSource"></param>
    ''' <param name="valueField"></param>
    ''' <param name="display"></param>
    ''' <param name="cmbOfDispIndex"></param>
    ''' <remarks></remarks>
    Private Sub CreateGridOfComboBoxAndInitial(ByVal grd As DataGridView, ByVal dataSource As DataTable, _
                                             ByVal valueField As String, ByVal display As String, _
                                             ByVal cmbOfDispIndex As Integer)
        Dim cmbCol As New DataGridViewComboBoxColumn()


        cmbCol.HeaderText = "comboxColumn"
        cmbCol.ValueMember = valueField
        cmbCol.DisplayMember = display
        cmbCol.Name = "comboxColumn"
        cmbCol.DataSource = dataSource

        grd.Columns.Insert(cmbOfDispIndex, cmbCol)
        ' 表示形式の設定  
        cmbCol.DisplayStyleForCurrentCellOnly = True
        cmbCol.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
    End Sub


    ''' <summary>
    ''' DBの値をグッリドのコンボボックスに設定
    ''' </summary>
    ''' <param name="grd"></param>
    ''' <param name="dataSource"></param>
    ''' <param name="cmbClmIndex"></param>
    ''' <param name="dbValueFieldIndex"></param>
    ''' <remarks></remarks>
    Private Sub SetGridCmbValueByDB(ByVal grd As DataGridView, ByVal dataSource As DataTable, _
                                    ByVal cmbClmIndex As Integer, ByVal dbValueFieldIndex As Integer)
        For i As Integer = 0 To dataSource.Rows.Count - 1
            grd.Rows(i).Cells(cmbClmIndex).Value = dataSource.Rows(i).Item(dbValueFieldIndex).ToString()
        Next
    End Sub


    'CellEnterイベントハンドラ(下拉框单击一次打开)
    Private Sub DataGridView1_CellEnter(ByVal sender As Object, _
            ByVal e As DataGridViewCellEventArgs) _
            Handles DataGridView1.CellEnter
        Dim dgv As DataGridView = CType(sender, DataGridView)

        If dgv.Columns(e.ColumnIndex).Name = "comboxColumn" AndAlso _
            TypeOf dgv.Columns(e.ColumnIndex) Is DataGridViewComboBoxColumn Then
            SendKeys.Send("{F4}")
        End If
    End Sub


    Private dataGridViewComboBox As DataGridViewComboBoxEditingControl = Nothing
    ''' <summary>
    ''' EditingControlShowingイベントハンドラ
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
            ByVal e As DataGridViewEditingControlShowingEventArgs) _
            Handles DataGridView1.EditingControlShowing
        '表示されているコントロールがDataGridViewComboBoxEditingControlか調べる
        If TypeOf e.Control Is DataGridViewComboBoxEditingControl Then
            Dim dgv As DataGridView = CType(sender, DataGridView)

            '該当する列か調べる
            If dgv.CurrentCell.OwningColumn.Name = "comboxColumn" Then
                '編集のために表示されているコントロールを取得
                Me.dataGridViewComboBox = _
                    CType(e.Control, DataGridViewComboBoxEditingControl)
                'SelectedIndexChangedイベントハンドラを追加
                AddHandler Me.dataGridViewComboBox.SelectedIndexChanged, _
                    AddressOf dataGridViewComboBox_SelectedIndexChanged
            End If
        End If
    End Sub


    ''' <summary>
    ''' CellEndEditイベントハンドラ
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, _
            ByVal e As DataGridViewCellEventArgs) _
            Handles DataGridView1.CellEndEdit
        'SelectedIndexChangedイベントハンドラを削除
        If Not (Me.dataGridViewComboBox Is Nothing) Then
            RemoveHandler Me.dataGridViewComboBox.SelectedIndexChanged, _
                AddressOf dataGridViewComboBox_SelectedIndexChanged
            Me.dataGridViewComboBox = Nothing
        End If
    End Sub


    ''' <summary>
    ''' SelectedIndexChangedイベントハンドラ
    ''' </summary>
    ''' <remarks>DataGridViewに表示されているコンボボックスのValueMemberとDisplayMemberを取得する</remarks>
    Private Sub dataGridViewComboBox_SelectedIndexChanged(ByVal sender As Object, _
            ByVal e As EventArgs)
        '選択されたアイテムを表示
        Dim cb As DataGridViewComboBoxEditingControl = _
            CType(sender, DataGridViewComboBoxEditingControl)
        ' 編集中のValueMemberを取得する(DataGridView1.CurrentRow.Cells(1).Value.ToString()エラーが出る重要)
        MessageBox.Show(cb.SelectedValue)
        ' 編集中のDisplayMemberを取得する(EditedFormattedValue重要)
        MessageBox.Show(DataGridView1.CurrentRow.Cells("comboxColumn").EditedFormattedValue)
    End Sub


    ''' <summary>
    ''' グリッド内コンボボックスセル値の取得
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Me.Cursor = Cursors.WaitCursor
            ' 編集後のValueMemberを取得する
            MessageBox.Show(DataGridView1.CurrentRow.Cells(1).Value.ToString())
            ' 編集後のDisplayMemberを取得する
            MessageBox.Show(DataGridView1.CurrentRow.Cells("comboxColumn").FormattedValue.ToString())
        Catch ex As Exception
            MessageBox.Show(ex.Message.ToString())
        Finally
            Me.Cursor = Cursors.Default
        End Try

    End Sub


End Class

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值