我在windows窗体中使用了comboBox,我绑定了数据源,只要表单加载,它就会正确地返回与组合框中特定名称相关联的Id。
private void PurchaseMaster_Load(object sender, EventArgs e)
{
DataTable dt = productMasterBAL.GetTable("Select * from productMaster");
comboBox1.DataSource = dt;
comboBox1.DisplayMember = "ProductName";
combBox1.ValueMember = "ProductId";
}
但每当我在Combobox中选择任何值时,我都会得到:
NullReferenceException未处理。对象引用未设置为 对象的实例
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
DataRowView row = comboBox1.SelectedValue as DataRowView;
MessageBox.Show(String.Format("{0}", row["ProductId"])); //This line is causing exception
}
有谁能告诉我怎样才能解决这个问题?
答案 0 :(得分:3)
我认为你应该检查combobox1.SelectedItem而不是SelectedValue。
DataRowView row = combobox1.SelectedItem as DataRowView;
SelectedItem是数据绑定行,它在组合框中创建了该条目。 SelectedValue将是该行的ProductID。
或者,您可以尝试
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string productId = combobox1.SelectedValue as string;
if (productId != null)
{
MessageBox.Show(productId);
}
}
答案 1 :(得分:1)
你调试了吗?检查该行是否为空?来自msdn:
as运算符就像一个强制转换操作。但是,如果转换 是不可能的,因为返回null而不是引发异常。
您是否检查过此表达式是否有效?
答案 2 :(得分:1)
你应该检查这样的值
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox cmb = (ComboBox)sender;
MessageBox.Show(cmb.SelectedValue.ToString());// cmb.SelectedText
}
这应该会在组合框中为您提供所选的产品ID
Combobox中的项目存储为ObjectCollection
,而不是您期望的DataRow或DataRowView。
答案 3 :(得分:0)
我认为row["ProductId"]
可能不是字符串字段,所以它在格式化时返回异常。
答案 4 :(得分:0)
您正尝试使用'safe-cast'将PName.SelectedValue
类型为“String”的对象转换为对象DataRowView \。如果无法将对象强制转换为所需的类,则as
将返回null。所以,实际的错误在于
DataRowView row = PName.SelectedValue as DataRowView;
尝试使用DataRowView row = (DataRowView)PName.SelectedValue
直接投射,你肯定会收到错误。
您应该再次查询数据源以获取数据对象。
答案 5 :(得分:0)
在这个帖子上查看我的通用解决方案:
c# loop through combobox where datasource is a datatable with text
基本上,你可以调用我的函数,告诉它每个ComboBox项的类型,它将完成其余的工作。
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
希望这有帮助!