读书人

VB2005-DataGridView有关问题

发布时间: 2012-01-06 22:55:18 作者: rapoo

VB2005-DataGridView问题。
请问如何把DataGridView的某个单元格设置成Combox的效果?

[解决办法]
如果某一列需要ComboBox的话,可以用DataGridViewComboBoxColumn
[解决办法]
以下是一段我在网上找到的程序,原文是C#的,我改成VB了。这段代码能实现一种只在当前编辑单元格中显示下拉列表框的方法,请看其sex部分,就是实现的效果。这段代码看起来长,其实大段的是构建数据表的部分,真正实现功能的并不长。希望对lz有所帮助。代码已经过测试。

参考:http://www.cnblogs.com/aaliujing/archive/2007/01/29/633103.html

Imports System
Imports System.Data
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms

Partial Public Class Form1

' 定义下拉列表框
Dim cmb_Temp As ComboBox = New ComboBox()

' <summary>
' 绑定性别下拉列表框
' </summary>
Private Sub BindSex()

Dim dtSex As DataTable = New DataTable()
dtSex.Columns.Add( "Value ")
dtSex.Columns.Add( "Name ")
Dim drSex As DataRow
drSex = dtSex.NewRow()
drSex(0) = "1 "
drSex(1) = "男 "
dtSex.Rows.Add(drSex)
drSex = dtSex.NewRow()
drSex(0) = "0 "
drSex(1) = "女 "
dtSex.Rows.Add(drSex)
cmb_Temp.ValueMember = "Value "
cmb_Temp.DisplayMember = "Name "
cmb_Temp.DataSource = dtSex
cmb_Temp.DropDownStyle = ComboBoxStyle.DropDownList

End Sub

' <summary>
' 为避免连接数据库,这里手工构造数据表,实际应用中应从数据库中获取
' </summary>
Private Sub BindData()

Dim dtData As DataTable = New DataTable()
dtData.Columns.Add( "ID ")
dtData.Columns.Add( "Name ")
dtData.Columns.Add( "Sex ")
Dim drData As DataRow
drData = dtData.NewRow()
drData(0) = 1
drData(1) = "张三 "
drData(2) = "1 "
dtData.Rows.Add(drData)
drData = dtData.NewRow()
drData(0) = 2
drData(1) = "李四 "
drData(2) = "1 "
dtData.Rows.Add(drData)
drData = dtData.NewRow()
drData(0) = 3
drData(1) = "王五 "
drData(2) = "1 "
dtData.Rows.Add(drData)
drData = dtData.NewRow()
drData(0) = 4
drData(1) = "小芳 "
drData(2) = "0 "
dtData.Rows.Add(drData)
drData = dtData.NewRow()
drData(0) = 5
drData(1) = "小娟 "
drData(2) = "0 "
dtData.Rows.Add(drData)
drData = dtData.NewRow()
drData(0) = 6
drData(1) = "赵六 "
drData(2) = "1 "
dtData.Rows.Add(drData)
dgv_User.DataSource = dtData

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

' 绑定性别下拉列表框
BindSex()

' 绑定数据表
BindData()

' 设置下拉列表框不可见
cmb_Temp.Visible = False

' 添加下拉列表框事件
'cmb_Temp.SelectedIndexChanged += New EventHandler(cmb_Temp_SelectedIndexChanged)
AddHandler cmb_Temp.SelectedIndexChanged, AddressOf cmb_Temp_SelectedIndexChanged

' 将下拉列表框加入到DataGridView控件中


dgv_User.Controls.Add(cmb_Temp)

End Sub

' 改变DataGridView列宽时将下拉列表框设为不可见
Private Sub dgv_User_ColumnWidthChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewColumnEventArgs) Handles dgv_User.ColumnWidthChanged

cmb_Temp.Visible = False

End Sub

' 当用户移动到性别这一列时单元格显示下拉列表框
Private Sub dgv_User_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles dgv_User.CurrentCellChanged

Try
If (dgv_User.CurrentCell.ColumnIndex = 2) Then
Dim rect As Rectangle = dgv_User.GetCellDisplayRectangle(dgv_User.CurrentCell.ColumnIndex, dgv_User.CurrentCell.RowIndex, False)
Dim sexValue As String = dgv_User.CurrentCell.Value.ToString()
If (sexValue = "1 ") Then
cmb_Temp.Text = "男 "
Else
cmb_Temp.Text = "女 "
End If
cmb_Temp.Left = rect.Left
cmb_Temp.Top = rect.Top
cmb_Temp.Width = rect.Width
cmb_Temp.Height = rect.Height
cmb_Temp.Visible = True
Else
cmb_Temp.Visible = False
End If
Catch ex As Exception

End Try

End Sub

' 当用户选择下拉列表框时改变DataGridView单元格的内容
Private Sub cmb_Temp_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)

If cmb_Temp.Text = "男 " Then
dgv_User.CurrentCell.Value = "男 "
dgv_User.CurrentCell.Tag = "1 "
Else
dgv_User.CurrentCell.Value = "女 "
dgv_User.CurrentCell.Tag = "0 "
End If

End Sub

' 绑定数据表后将性别列中的每一单元格的Value和Tag属性(Tag为值文本,Value为显示文本)
Private Sub dgv_User_DataBindingComplete(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles dgv_User.DataBindingComplete

For i As Int32 = 0 To dgv_User.Rows.Count - 1
If (dgv_User.Rows(i).Cells(2).Value <> Nothing & dgv_User.Rows(i).Cells(2).ColumnIndex = 2) Then
dgv_User.Rows(i).Cells(2).Tag = dgv_User.Rows(i).Cells(2).Value.ToString()
If (dgv_User.Rows(i).Cells(2).Value.ToString() = "1 ") Then
dgv_User.Rows(i).Cells(2).Value = "男 "
ElseIf (dgv_User.Rows(i).Cells(2).Value.ToString() = "0 ") Then
dgv_User.Rows(i).Cells(2).Value = "女 "
End If
End If
Next

End Sub

' 滚动DataGridView时将下拉列表框设为不可见
Private Sub dgv_User_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles dgv_User.Scroll

cmb_Temp.Visible = False

End Sub

End Class
[解决办法]
AddComboBoxColumns()
Private Sub AddComboBoxColumns()
'Dim comboboxColumn As New DataGridViewComboBoxColumn()
'comboboxColumn = CreateComboBoxColumn()
'SetAlternateChoicesUsingDataSource(comboboxColumn)
'comboboxColumn.HeaderText = _
' "TitleOfCourtesy (via DataSource property) "
'DataGridView1.Columns.Insert(0, comboboxColumn)
‘ comboboxColumn.HeaderText新列的标题
‘dgdLocation.Columns.Insert(14, comboboxColumn)插入一列在DataGridView控件上

Dim comboboxColumn As New DataGridViewComboBoxColumn()


comboboxColumn = CreateComboBoxColumn()
comboboxColumn.HeaderText = GetColumn( "Transfer ")
SetAlternateChoicesUsingDataSource(comboboxColumn)
dgdLocation.Columns.Insert(14, comboboxColumn)
End Sub

Private Function RetrieveAlternativeTitles() As DataTable
Dim dt As New DataTable
Dim i As Integer
Dim newRow As DataRow
dt.Columns.Add( "Transfer ", GetType(System.Int32))
For i = 0 To 2
newRow = dt.NewRow()
newRow( "Transfer ") = i
dt.Rows.Add(newRow)
Next
Return dt
End function


Private Sub SetAlternateChoicesUsingDataSource( _
ByRef comboboxColumn As DataGridViewComboBoxColumn)
With comboboxColumn
.DataSource = RetrieveAlternativeTitles()
.ValueMember = "Transfer "
.DisplayMember = .ValueMember
End With
End Sub

‘.DataPropertyName = "Transfer "绑定数据到DataGridView控件上

Private Function CreateComboBoxColumn() _
As DataGridViewComboBoxColumn
Dim column As New DataGridViewComboBoxColumn()

With column
.DataPropertyName = "Transfer "
.HeaderText = "Transfer "
.DropDownWidth = 160
.Width = 90
.MaxDropDownItems = 3
.FlatStyle = FlatStyle.Flat
End With
Return column
End Function



[解决办法]
如果能准确的知道某一个单元格的话可以很容易
http://community.csdn.net/Expert/topic/5342/5342776.xml?temp=2.010745E-02
下面有个叫小竹的程序你可以参考

读书人网 >VB Dotnet

热点推荐