我有两个=SUM(IF(A1:G1<>"X",0,INDEX(FREQUENCY(IF(A1:G1="X",COLUMN(A1:G1)),IF(A1:G1<>"X",COLUMN(A1:G1))),N(IF({1},SUBTOTAL(2,OFFSET(A1,0,0,1,COLUMN(A1:G1)))))+1,1)))
分别用于ComboBox
和Employee
。
在第一个PayrollName
('PayrollName')上,使用ComboBox
很好,但是在下一个SelectedValue
上出现此错误:
从类型'VB $ AnonymousType_11(Integer,String)'到类型'Integer'的转换无效
我试图搜索错误,但是没有运气,我什至找不到一个
我的用于将数据加载到我的ComboBox
Employee
ComboBox
我获取Dim _list = MyContext.Employees.Where(Function(q) q.Status = True).Select(Function(q) New With
{
q.EID,
.Name = q.Lastname & ", " & q.Firstname
}).ToList
Dim list = _list.OrderBy(Function(x) x.Name).ToList()
With cbxEmployee
.DataSource = list.ToList
.DisplayMember = "Name"
.ValueMember = "EID"
End With
的代码
SelectedValue
为什么我无法获得所选值? 抱歉,我的英文不太好
答案 0 :(得分:2)
代码中的第一条语句包含以下lambda表达式:
Function(q) New With
{
q.EID,
.Name = q.Lastname & ", " & q.Firstname
}
它将生成一个带有Integer字段(EID)和String字段(Name)的匿名类型。这就是您在错误消息中看到的VB$AnonymousType_11(Of Integer,String)
。这些值已分配给组合框,因此,当您查看ComboBox的SelectedValue
时,这就是您要使用的值。
所以您需要这样做:
Dim EmployeeID As Integer = cbxEmployee.SelectedValue.EID
更好
这仅因为Option Strict
已关闭而起作用,并且这很糟糕。这会导致各种运行时错误。您应该打开Option Strict。您编写代码似乎会引发许多新错误,但每个错误实际上都是一颗等待定时熄灭的定时炸弹。这样,您就可以立即修复这些错误,以免给用户造成问题。您将获得更好,更快的代码,并且更易于维护。
在这种情况下,这可能意味着为这些列表对象定义一个Class
,这似乎很重要,但实际上只有四行代码:
Public Class EmployeeListItem
Public Property EID As Integer
Public Property Name As String
End Class
然后,我将在分配数据源之前在 之前设置DisplayMember和ValueMember项。结合其他修复程序,您会得到:
Dim list = MyContext.Employees.
Where(Function(q) q.Status = True).
Select(Function(q) New EmployeeListItem With
{
q.EID,
.Name = q.Lastname & ", " & q.Firstname
}).
OrderBy(Function(x) x.Name)
With cbxEmployee
.DisplayMember = "Name"
.ValueMember = "EID"
.DataSource = list
End With
注意,我从来不需要打{{1}}。这样可以减少内存使用,并且在某些情况下可以大大提高代码的效率。
然后,在使用值时,您要像这样强制转换:
ToList()
答案 1 :(得分:0)
尝试打开Option Strict。 SelectedValue不是整数,因此不能直接插入整数。在这种情况下,它将返回您创建的AnonymousType的对象。您需要确定的.Name或.EID