前几天遇到了一些问题,并且在我得到帮助后成功解决了问题(combobox population based on each other sql c#)我想出的解决方案就像魅力一样:
public void City()
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand("SELECT DISTINCT CityName FROM City WHERE CountryName = @CountryName", conn))
{
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
cmd.Parameters.AddWithValue("@CountryName", this.cmb_countryname.SelectedValue);
DataTable dt = new DataTable();
da.Fill(dt);
DataRow dr = dt.NewRow();
dr["CityName"] = "";
dt.Rows.InsertAt(dr, 0);
this.city.DisplayMember = "CityName";
this.city.ValueMember = "CityName";
this.city.DataSource = dt;
}
}
}
}
到目前为止,这么好。在cmb_countryname中选择Country1,City1在cmb_cityname中映射到它。正如我所说,没有问题(再次感谢显示此解决方案的用户)。但这是扭曲。一旦我将两个组合框与数据一起加载,我就将它们发送到gridview。还好。单击给定行,我将检索所有列,包括国家和城市,以及各种不同的组合框。还是没问题。现在我想要发生的是以下内容:当我在这个新的组合框中更改一个国家时,我希望拥有与以前相同的行为,即它将国家映射到城市。我对此的代码与前一个代码相同(完美无缺)显然该方法的名称和组合框已更改:
public void CityChange()
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand("SELECT DISTINCT CityName FROM City WHERE CountryName = @CountryName", conn))
{
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
cmd.Parameters.AddWithValue("@CountryName", this.cmb_passedcountryname.SelectedValue);
DataTable dt = new DataTable();
da.Fill(dt);
DataRow dr = dt.NewRow();
dr["CityName"] = "";
dt.Rows.InsertAt(dr, 0);
this.passedcity.DisplayMember = "CityName";
this.passedcity.ValueMember = "CityName";
this.passedcity.DataSource = dt;
}
}
}
}
我正面临着这条错误信息,并且一直试图解决它超过一个小时:
“附加信息:从对象类型System.Data.DataRowView到已知的托管提供者本机类型不存在映射。”
根据我的理解,它将this.cmb_passedcountryname.SelectedValue
视为System.Data.DataRowView
,尽管不是。我是在正确的道路上,如果是的话,任何想法我应该如何进行?谢谢!
编辑:
CityChange()
在passcountryname的SelectedIndexChanged
属性上被调用。
EDIT2:
代码中的一些错误,已编辑。
解决方案:
Why I get "System.Data.DataRowView" instead of real values in my Listbox?
感谢所有帮助我的人。欢呼的家伙答案 0 :(得分:0)
我认为您可以在
中调试和查看值cmb_passedcountryname.SelectedValue
可能为空值