为什么我无法获得所选值?

时间:2018-11-20 19:26:15

标签: vb.net combobox selectedvalue

我有两个=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))) 分别用于ComboBoxEmployee。 在第一个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

为什么我无法获得所选值? 抱歉,我的英文不太好

2 个答案:

答案 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