我没有找到任何好的解决方案。一点解释。我有几个列的DataGridView。在第一列中,单元格显示某个文件的路径。从第三列开始,我有几个ComboBoxCells。
在下拉框中,我希望使自动选择的值与第一个单元格中文件路径的部分相等(不区分大小写(。所有这些都发生在Form.Load
上
稍后,用户可以自行选择。
Dim CmbCell As DataGridViewComboBoxCell = CType(DgvRow.Cells(2), DataGridViewComboBoxCell)
Dim ResultString As String
If HasDropDownThisValue(DgvRow.Cells(0).Value.ToString, CmbCell, ResultString) Then
CmbCell.Value = CmbCell.Items(CmbCell.Items.IndexOf(ResultString))
End If
这是If
语句中使用的方法:
Private Function HasDropDownThisValue(ByVal GivenValue As String, ByRef comboCeel As DataGridViewComboBoxCell, ByRef ReturnValue As String) As Boolean
ReturnValue = ""
Dim boolret As Boolean = False
Dim comparestring As String
Dim StringArr() As String = Split(GivenValue, CStr(Path.DirectorySeparatorChar), -1, VisualBasic.CompareMethod.Text)
comparestring = StringArr(0)
For i As Integer = 1 To UBound(StringArr)
If comboCeel.Items.Cast(Of String).Contains(comparestring, StringComparer.OrdinalIgnoreCase) Then
ReturnValue = comparestring
boolret = True
Exit For
Else
comparestring = String.Format("{0}{1}{2}", comparestring, Path.DirectorySeparatorChar, StringArr(i))
End If
Next
Return boolret
End Function
线路:
CmbCell.Value = CmbCell.Items(CmbCell.Items.IndexOf(ResultString))
当事例不匹配时抛出异常。如何避免这种情况
我可能可以执行以下操作:CmbCell.Value = ResultString
,但我更喜欢在Items集合中预先定义值。
也许这样的东西是可能的(用于函数(:
comboCeel.Items.Cast(Of String).Contains(comparestring, StringComparer.OrdinalIgnoreCase)
由于需要不区分大小写的匹配,因此可以使用IndexOf((,将StringComparison选项设置为StringComparison.OrdinalIgnoreCase
,在DataGridViewComboBoxCell.ObjectCollection
中查找字符串值(在本例中,它表示字符串的集合(。
我建议在HasDropDownThisValue
方法中设置Dim ResultString As String = Nothing
,而不是将其重置为String.Empty
(""
(:如果该方法返回False
,则设置[ComboBoxCell].Value = ResultString
(即Nothing
(,因此清除ComboBox选择
否则,请使用IndexOf()
在集合中查找匹配的字符串。但是,如果没有找到匹配项,则结果值将为Nothing
,因此清除ComboBox;否则设置找到的值:
(重命名局部变量以符合标准命名约定(
Dim resultString As String = Nothing
Dim cmbCell = CType(DgvRow.Cells(2), DataGridViewComboBoxCell)
If HasDropDownThisValue(DgvRow.Cells(0).Value?.ToString(), cmbCell, resultString) Then
resultString = cmbCell.Items.OfType(Of String).
FirstOrDefault(Function(i) i.IndexOf(resultString, StringComparison.OrdinalIgnoreCase) >= 0)
End If
cmbCell.Value = resultString
正如您所看到的,传递resultString
作为参考变得非常无用。您可以更改方法以返回String而不是Boolean,因为我们无论如何都需要使用该字符串(无论HasDropDownThisValue
是否找到匹配项(。
此外,您不应该传递ComboBox CellByRef
:此对象已经是引用类型,您应该传递它ByVal
(或者不指定修饰符,因为ByVal
是默认值(。