Vs2005中DataGridView点到单元格时出现下拉列表框
图1
图2
具体方法如下:
第一:
先在窗体设计时拖一个ComBoBox控件,然后在里面的ITEMS设好你要下拉项 :
根据前一个单元格(j_row:表中当前的行)的物料编号从数据库中自动ITEMS填充,物料规格需要涉及两个数据库,一个是主数据库:货品目录中的(存储物料编码的);一个是货品规格里专门存储规格的标。
Private Sub rk_xz_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rk_xz.SelectedIndexChanged
If yes = True Then
strsql = "select * from 货品规格 where 编号='" & str & "'and 规格型号='" & rk_xz.Text & "'"
Dim my_Reader As SqlDataReader
my_Reader = execAdapter(strsql)
If my_Reader.Read() Then
dgv_rk.Item(2, j_row).Value = banjiao(rk_xz.Text)
dgv_rk.Item(5, j_row).Value = my_Reader.Item("单位").ToString
dgv_rk.Item(10, j_row).Value = my_Reader.Item("库存").ToString
dgv_rk.Item(7, j_row).Value = my_Reader.Item("单价").ToString
dgv_rk.Item(12, j_row).Value = True
cn.Close()
my_Reader.Dispose()
Else
cn.Close()
my_Reader.Dispose()
strsql = "select * from 货品目录 where 编号='" & str & "'"
Dim myReader As SqlDataReader
myReader = execAdapter(strsql)
If myReader.Read() Then
dgv_rk.Item(2, j_row).Value = banjiao(rk_xz.Text)
dgv_rk.Item(5, j_row).Value = myReader.Item("单位").ToString
dgv_rk.Item(10, j_row).Value = myReader.Item("当前库存").ToString
dgv_rk.Item(6, j_row).Value = myReader.Item("入库价格").ToString
dgv_rk.Item(12, j_row).Value = False
cn.Close()
myReader.Dispose()
End If
End If
End If
End Sub
第二:
在窗体的Load方法中加入:dgv_rk.Controls.Add(g_ComBoBox);也就是把ComBoBox控件添加到DataGridView控件中:
dgv_rk.Controls.Add(rk_xz)
加入dgv_rk其他事件也可:
Private Sub dgv_rk_CellValidated(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv_rk.CellValidated
dgv_rk.Controls.Add(rk_xz)
end sub
第三:(关键代码)
在DataGridView控件的CurrentCellChanged方法中写如下代码:
Private Sub dgv_rk_CurrentCellChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dgv_rk.CurrentCellChanged
Dim CurrnetCell As DataGridViewCell = dgv_rk.CurrentCell
Try
If CurrnetCell.ToString() <> "" And CurrnetCell.OwningColumn.Name = "规格" Then
Dim TmpRect As Rectangle = dgv_rk.GetCellDisplayRectangle(CurrnetCell.ColumnIndex, CurrnetCell.RowIndex, True)
rk_xz.Size = TmpRect.Size
rk_xz.Top = TmpRect.Top
rk_xz.Left = TmpRect.Left
rk_xz.Visible = True
Else
rk_xz.Visible = False
End If
Catch ex As Exception
End Try
End Sub