我有这段代码
private void cmb_public_manag_SelectedIndexChanged(object sender, EventArgs e)
{
//DB_Mange.fill_combox_Exchange("[Public_administration_dept]", cmb_public_manag_dept, "dept_id", "dept_name", cmb_public_manag.SelectedValue, "");
using (SqlConnection con = new SqlConnection(SQL_DB.con_str))
{
con.Open();
using (SqlCommand scm = new SqlCommand())
{
scm.Connection = con;
scm.CommandText = "select * from Public_administration_dept where Public_administration_id=@dept_id";
scm.Parameters.AddWithValue("@dept_id",cmb_public_manag.SelectedValue);
DataTable dt = new DataTable();
SqlDataAdapter adpt = new SqlDataAdapter();
adpt.SelectCommand = scm;
adpt.Fill(dt);
cmb_public_manag_dept.DisplayMember = dt.Columns["dept_name"].ToString();
cmb_public_manag_dept.ValueMember = dt.Columns["dept_id"].ToString();
cmb_public_manag_dept.DataSource = dt;
}
}
}
总是向我显示此错误
从对象类型System.Data.DataRowView到已知的对象类型不存在任何映射 托管提供者本机类型。 此代码SelectedIndexChanged
答案 0 :(得分:1)
我猜这个例外是在
提出的scm.Parameters.AddWithValue("@dept_id",cmb_public_manag.SelectedValue);
cmb_public_manag.SelectedValue
不是int
而是DataRowView
。然后使用:
int dept_id = ((DataRowView) cmb_public_manag.SelectedValue).Row.Field<int>("dept_id");
scm.Parameters.AddWithValue("@dept_id", dept_id );
cmb_public_manag.SelectedValue
成为DataRowView
而不是int
的原因是作业顺序。
始终提供DataSource
作为最后一步,因为这可能会导致winforms中的事件。在这些活动中,尚未分配DisplayMember
和ValueMember
。在这种情况下,代码位于您当前正在分配SelectedIndexChanged
的{{1}}的{{1}}中,因此该方法会自行调用。但是因为您已经分配ComboBox
,所以DataSource
未分配,整个对象从DataSource
返回。
所以改为使用:
ValueMember
请注意,当您更改其中的数据源时,您还应该取消订阅此事件。
另请注意,我已将SelectedValue
更改为cmb_public_manag_dept.SelectedIndexChanged -= cmb_public_manag_SelectedIndexChanged;
cmb_public_manag_dept.DisplayMember = "dept_name";
cmb_public_manag_dept.ValueMember = "dept_id";
cmb_public_manag_dept.DataSource = dt;
cmb_public_manag_dept.SelectedIndexChanged += cmb_public_manag_SelectedIndexChanged;
只是{。}}。