在ComboBoxCell.Items集合中使用IndexOf会在不区分大小写的比较中引发异常



我没有找到任何好的解决方案。一点解释。我有几个列的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是默认值(。

相关内容

  • 没有找到相关文章

最新更新