【发布时间】:2023-03-06 18:05:01
【问题描述】:
前几天遇到了一些问题,当我得到帮助时成功解决了 (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?
感谢所有试图帮助我的人。伙计们干杯
【问题讨论】:
-
在该行和inspector区域放一个断点,写这个
this.cmb_passedcountryname.SelectedValue并发布值,拜托 -
根据断点,认为是DataRowView。
-
this.cmb_passedcountryname.SelectedValue {System.Data.DataRowView} 对象 {System.Data.DataRowView}
-
你是如何加载 cmb_passedcountryname 的?
-
@Stephen 同时我找到了解决方案(请参阅已编辑的问题),但为了回复您,cmb_passedcountryname 是从 gridview 加载的。这实际上是问题所在,由于某种原因,combox 的值被视为 DataRowView 并且需要像您在解决方案中看到的那样进行转换。