无法将类型为'<> f__AnonymousType0`2 [System.String,System.Int32]'的对象强制转换为'System.IConvertible'

时间:2015-07-18 21:36:14

标签: winforms c#-4.0 lambda

我正在尝试将数据列表框填充到列表框的单击事件上的文本框但是我发现了这个错误

  

其他信息:无法将类型为'<> f__AnonymousType0`2 [System.String,System.Int32]'的对象转换为'System.IConvertible'

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    StudenRecordDataContext std = new StudentRecordDataContext();
    int selectedValue = Convert.ToInt32(listBox1.SelectedValue);
    StudentRecord sr = std.StudentRecords.Single(s =>s.ID==selectedValue);
    txtId.Text = sr.ID.ToString();
    txtName.Text = sr.Name;
    txtPassword.Text = sr.Password;
    txtCnic.Text = sr.CNIC;
    txtEmail.Text = sr.Email;
}

我认为该错误在StudentRecord sr = std.StudentRecords.Single(s =>s.ID==selectedValue);

该错误来自何处以及我需要更改以修复该错误?

1 个答案:

答案 0 :(得分:1)

我很遗憾地这么说,但是你向我们提供了错误的诊断程序错误。

罪魁祸首就是这条线:

int selectedValue = Convert.ToInt32(listBox1.SelectedValue);

我希望您之前填充listbox1来自StudentRecords的{​​{1}}来自StudentRecordDataContext实例的集合。

如果从列表框中选择一个值,SelectedValue会保存您添加到项目集合中的对象(或通过设置DataSource属性来间接保存)。

要修复代码,您可以先确保对象再次成为StudentRecord。这并不容易,因为你创建了一个匿名类型,我希望这样:

 listbox1.DataSource = new StudentRecordDataContext()
    .StudentRecords
    .Select(sr => new { Name = sr.Name, ID = sr.ID });

当您尝试检索SelectedValue时,您将获得该匿名类型,而不是强类型的内容。

创建一个具有Name和Id属性的新类,而不是添加匿名类型:

class StudentRecordItem 
{
     public string Name {get; set;}
     public int ID {get; set;}
}

填充数据源时为每条记录创建StudentRecordItem类并将其添加到数据源中。

 listbox1.DataSource = new StudentRecordDataContext()
    .StudentRecords
    .Select(sr => new StudentRecordItem { Name = sr.Name, ID = sr.ID });

您的代码可能会变成这样:

StudentRecordItem selectedStudent =  listBox1.SelectedValue as StudentRecordItem;
if (selectedStudent == null) 
{
    MessageBox.Show("No student record");
    return;
}

int selectedValue = selectedStudent.ID;

您不需要Convert.ToInt32,因为我认为ID已经是一个int。

请记住debugger in Visual Studio显示所有属性和变量的实际类型和值。当类型转换失败时,您可以检查您正在使用的实际类型。