none
请教datagridview如何给每个单元格增加不同的下拉列表?

    问题

  • 请教datagridview如何给每个单元格增加不同的下拉列表?
    我要根据"Finish","Color"的不同选择组合,在"Type"列出不同的选项。下面这种写法会导致选择第二个时之前的选择丢失,请教应该如何处理?为了方便描述,我将一些属性和变量固定

        Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            DGVSM.Rows.Add(3) '实际可能是1到6行不等
        End Sub
    
    
        Private Sub DGV_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellEndEdit
            '为了描述,将2个以下字符型变量固定
            arrSMGroupName = "绿色 哑光 FSR-8000;绿色 无卤 KSM-S6188EHG1;蓝色 KSM-S6189 BL01;红色 无卤 KSM-S6189 ER04;浅绿色 KSM-S6189 GL27;红色 KSM-S6189 R04".Split(";")
            arrSMName = "FSR-8000;KSM-S6188EHG1;KSM-S6189 BL01;KSM-S6189 ER04;KSM-S6189 GL27;KSM-S6189 R04".Split(";")
    
            With DGV
                Dim Row As Integer = .CurrentRow.Index
                If .Item(1, Row).Value <> "" And .Item(2, Row).Value <> "" Then
                    .Item(3, Row).Value = ""
                    Dim Finish As String = .Item(1, Row).Value
                    Dim Color As String = .Item(2, Row).Value
                    Dim dtgCell As New DataGridViewComboBoxCell  '给单元格加下拉项
    
                    If Finish = "亮光" Then
                        For i As Integer = 0 To arrSMGroupName.GetUpperBound(0)
                            If chkSMHF.Checked Then
                                If arrSMGroupName(i).IndexOf("哑") = -1 And arrSMGroupName(i).IndexOf(Color) > -1 And arrSMGroupName(i).IndexOf("无卤") > -1 Then '不含"哑"的即为亮光
                                    dtgCell.Items.Add(arrSMName(i))
                                End If
                            Else
                                If arrSMGroupName(i).IndexOf("哑") = -1 And arrSMGroupName(i).IndexOf(Color) > -1 Then '不含"哑"的即为亮光
                                    dtgCell.Items.Add(arrSMName(i))
                                End If
                            End If
                        Next
                    End If
                    .Item(3, Row) = dtgCell '绑定到此单元格
                End If
            End With
        End Sub
    

    2016年11月26日 2:27

答案

  • 你好,

    没有奏效的原因是你添加的位置不对,请参照以下代码,注意添加代码的位置:

    Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
            '这是添加的内容
            If e.ColumnIndex = 3 Then
                Return
            End If
    
            Dim arrSMGroupName As String()
            Dim arrSMName As String()
            '为了描述,将2个以下字符型变量固定
            arrSMGroupName = "绿色 哑光 FSR-8000;绿色 无卤 KSM-S6188EHG1;蓝色 KSM-S6189 BL01;红色 无卤 KSM-S6189 ER04;浅绿色 KSM-S6189 GL27;红色 KSM-S6189 R04".Split(";")
            arrSMName = "FSR-8000;KSM-S6188EHG1;KSM-S6189 BL01;KSM-S6189 ER04;KSM-S6189 GL27;KSM-S6189 R04".Split(";")
    
            With DataGridView1
                Dim Row As Integer = .CurrentRow.Index
                If .Item(1, Row).Value <> "" And .Item(2, Row).Value <> "" Then
                    .Item(3, Row).Value = ""
                    Dim Finish As String = .Item(1, Row).Value
                    Dim Color As String = .Item(2, Row).Value
                    Dim dtgCell As New DataGridViewComboBoxCell  '给单元格加下拉项
    
                    If Finish = "亮光" Then
                        For i As Integer = 0 To arrSMGroupName.GetUpperBound(0)
                            If chkSMHF.Checked Then
                                If arrSMGroupName(i).IndexOf("哑") = -1 And arrSMGroupName(i).IndexOf(Color) > -1 And arrSMGroupName(i).IndexOf("无卤") > -1 Then '不含"哑"的即为亮光
                                    dtgCell.Items.Add(arrSMName(i))
                                End If
                            Else
                                If arrSMGroupName(i).IndexOf("哑") = -1 And arrSMGroupName(i).IndexOf(Color) > -1 Then '不含"哑"的即为亮光
                                    dtgCell.Items.Add(arrSMName(i))
                                End If
                            End If
                        Next
                    End If
                    .Item(3, Row) = dtgCell '绑定到此单元格
                End If
            End With

    希望能够解决你的问题,如果问题仍然存在,请随时回复。

    Best Regards,

    Neda Zhang


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 leon1526 2016年11月30日 7:44
    • 取消建议作为答案 leon1526 2016年11月30日 10:12
    • 已建议为答案 leon1526 2016年11月30日 10:12
    • 已标记为答案 Leon15261 2016年12月2日 7:22
    2016年11月30日 1:32

全部回复

  • 你好,

    Thank you for posting in MSDN Forum.

    >>我要根据"Finish","Color"的不同选择组合,在"Type"列出不同的选项。下面这种写法会导致选择第二个时之前的选择丢失,请教应该如何处理?

    根据你的描述,我不确定你说的“导致选择第二个时之前的选择失效”是什么意思。但是我尝试着测试了你的代码,发现在运行时,如果执行下面代码可能会出现如图所示的情况:

    If .Item(1, Row).Value <> "" And .Item(2, Row).Value <> "" Then
                    .Item(3, Row).Value = ""

    我不确定你是不是在运行的遇到以上问题,但是根据你的代码我测试的结果是:当我选中前两列的时候再选择Column3的时候Column3的值就会失效。根据这种情况,我建议你可以在CellEndEdit事件中添加以下代码:

     If e.ColumnIndex = 3 Then
                Return
            End If

    这样Column3的值就不会失效。

    如果我重现的问题不是你所遇到的问题,请你提供完整的代码,这样可以更方便的为你解决相关问题。

    希望我的回答对你有所帮助。

    Best Regards,

    Neda Zhang


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 leon1526 2016年11月30日 8:07
    2016年11月29日 5:55
  • Hi Neda,

    你所重现的问题正是我所说的问题,抱歉我没有描述清楚。

    按照你的建议我加了If e.ColumnIndex = 3 Then Return还是不行.不知道是不是我加的不对还是别的原因.

        Private Sub DGVSM_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellEndEdit
            '为了方便描述,将2个以下字符型变量固定
            arrSMGroupName = "绿色 哑光 FSR-8000;绿色 无卤 KSM-S6188EHG1;蓝色 KSM-S6189 BL01;红色 无卤 KSM-S6189 ER04;浅绿色 KSM-S6189 GL27;红色 KSM-S6189 R04".Split(";")
            arrSMName = "FSR-8000;KSM-S6188EHG1;KSM-S6189 BL01;KSM-S6189 ER04;KSM-S6189 GL27;KSM-S6189 R04".Split(";")
    
            With DGV
                Dim Row As Integer = .CurrentRow.Index
                If .Item(1, Row).Value <> "" And .Item(2, Row).Value <> "" Then
                    .Item(3, Row).Value = ""
                    Dim Finish As String = .Item(1, Row).Value
                    Dim Color As String = .Item(2, Row).Value
                    Dim dtgCell As New DataGridViewComboBoxCell
    
                    '增加以下判断问题仍存在
                    If e.ColumnIndex = 3 Then
                        Return
                    End If
    
                    If Finish = "亮光" Then
                        For i As Integer = 0 To arrSMGroupName.GetUpperBound(0)
                            If chkSMHF.Checked Then
                                If arrSMGroupName(i).IndexOf("哑") = -1 And arrSMGroupName(i).IndexOf(Color) > -1 And arrSMGroupName(i).IndexOf("无卤") > -1 Then '不含"哑"的即为亮光
                                    dtgCell.Items.Add(arrSMName(i))
                                End If
                            Else
                                If arrSMGroupName(i).IndexOf("哑") = -1 And arrSMGroupName(i).IndexOf(Color) > -1 Then '不含"哑"的即为亮光
                                    dtgCell.Items.Add(arrSMName(i))
                                End If
                            End If
                        Next
                    End If
                    .Item(3, Row) = dtgCell
                End If
            End With
        End Sub


    • 已编辑 leon1526 2016年11月30日 0:26 修改
    2016年11月30日 0:18
  • 你好,

    没有奏效的原因是你添加的位置不对,请参照以下代码,注意添加代码的位置:

    Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
            '这是添加的内容
            If e.ColumnIndex = 3 Then
                Return
            End If
    
            Dim arrSMGroupName As String()
            Dim arrSMName As String()
            '为了描述,将2个以下字符型变量固定
            arrSMGroupName = "绿色 哑光 FSR-8000;绿色 无卤 KSM-S6188EHG1;蓝色 KSM-S6189 BL01;红色 无卤 KSM-S6189 ER04;浅绿色 KSM-S6189 GL27;红色 KSM-S6189 R04".Split(";")
            arrSMName = "FSR-8000;KSM-S6188EHG1;KSM-S6189 BL01;KSM-S6189 ER04;KSM-S6189 GL27;KSM-S6189 R04".Split(";")
    
            With DataGridView1
                Dim Row As Integer = .CurrentRow.Index
                If .Item(1, Row).Value <> "" And .Item(2, Row).Value <> "" Then
                    .Item(3, Row).Value = ""
                    Dim Finish As String = .Item(1, Row).Value
                    Dim Color As String = .Item(2, Row).Value
                    Dim dtgCell As New DataGridViewComboBoxCell  '给单元格加下拉项
    
                    If Finish = "亮光" Then
                        For i As Integer = 0 To arrSMGroupName.GetUpperBound(0)
                            If chkSMHF.Checked Then
                                If arrSMGroupName(i).IndexOf("哑") = -1 And arrSMGroupName(i).IndexOf(Color) > -1 And arrSMGroupName(i).IndexOf("无卤") > -1 Then '不含"哑"的即为亮光
                                    dtgCell.Items.Add(arrSMName(i))
                                End If
                            Else
                                If arrSMGroupName(i).IndexOf("哑") = -1 And arrSMGroupName(i).IndexOf(Color) > -1 Then '不含"哑"的即为亮光
                                    dtgCell.Items.Add(arrSMName(i))
                                End If
                            End If
                        Next
                    End If
                    .Item(3, Row) = dtgCell '绑定到此单元格
                End If
            End With

    希望能够解决你的问题,如果问题仍然存在,请随时回复。

    Best Regards,

    Neda Zhang


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 leon1526 2016年11月30日 7:44
    • 取消建议作为答案 leon1526 2016年11月30日 10:12
    • 已建议为答案 leon1526 2016年11月30日 10:12
    • 已标记为答案 Leon15261 2016年12月2日 7:22
    2016年11月30日 1:32
  • 非常感谢Neda,困扰了很久的问题终于解决了。
    2016年11月30日 7:43
  • 你好,

    很高兴你的问题得到了解决,感谢你的分享。

    请将有用的回答标记为答案,我会将解决方案介绍给论坛中遇到相同问题的成员,以便于解决相关问题。如图所示:

    感谢你的参与。

    Best Regards,

    Neda Zhang


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.



    2016年11月30日 7:58
  • 不好意思,Neda,我为什么找不到“标记为答复”?我点了"建议作为答复"
    2016年11月30日 10:20
  • 你好,

    你需要用发帖人的账号登录才有“标记为答复”的权限,此贴中你使用了两个账号参与,名为“leon5183”的账号是没有权限标记为答复的。

    谢谢您的参与和分享,如果有相关问题请随时联系我们。

    Best Regards,

    Neda Zhang


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2016年12月1日 1:34