我有一个班级Person
,其中包含数据成员fullName
,adress
,occupation
。
我制作了List
类型的Person
,并在其中存储了几个Person
类型的对象。
我的Windows窗体GUI上有一个组合框和一个datagridview。
我想要做的是当您从组合框中选择一个项目时(它会自动填充来自Persons
的{{1}}个对象)datagridview显示一行,显示当前所选项目的{ {1}}和List
。
为了从列表中获取有关某人的信息,我使用了我创建的方法 - fullName
。此方法返回address
对象。然后我像这样使用那个对象:
PersonInfo(string id)
问题是我得到一个空异常,通常位于Person
行。我认为private void combobox_SelectedValueChanged(object sender, EventArgs e)
{
Person myObj = PersonInfo(combobox.SelectedText.ToString());
dataGridView1.Rows.Clear();
int index = dataGridView1.Rows.Add();
DataGridViewRow row = dataGridView1.Rows[index];
row.Cells["cFullName"].Value = myObj.fullName;
row.Cells["cAddress"].Value = myObj.address;
}
是造成这种情况的原因,但不知道使用哪种其他方法从组合框中获取信息并将其传递给row.Cells["cFullName"].Value = myObj.fullName;
。
答案 0 :(得分:0)
您的代码的问题在于它依赖于在此特定时刻为空的SelectedText。你应该做的是通过将人员列表分配给ComboBox并使用对象来使用DataBinding,从而消除了查找匹配条目的需要。人员需要拥有公共属性__ fullname __和__ address __否则绑定将无效。
在表单OnLoad中分配DataSource:
combobox.DataSource = myListOfPersons;
// this can be set in designer but for brevity I set it here
combobox.DisplayMember = "fullname"; // Case must match.
您的处理程序现在通过简单地转换SelectedItem来找到所选的人员。
private void combobox_SelectedValueChanged(object sender, EventArgs e)
{
Person myObj = (Person)combobox.SelectedItem;
// filling the grid
dataGridView1.DataSource = new List<Person> { myObj };
}
作为旁注,但是使用调试工具会使生活变得更加容易。在要执行暂停的行上按F9,运行应用程序,当它停止时将鼠标悬停在变量/成员名称上以查看其值,或者右键单击并按QuickWatch查看对象的所有属性的值。这个工具只会告诉你myObj是null,进一步检查SelectedText会告诉你它是空的,禁止PersonInfo函数找到合适的Person。