我有这个密码
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
发布于 2015-03-25 13:51:53
我想例外情况是在
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的ComboBox中,因此该方法调用自己。但是,由于您已经首先分配了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;注意,当您更改事件中的数据源时,也应该取消订阅该事件。
还请注意,我已经将dt.Columns["dept_name"].ToString()更改为简单的"dept_name",这是相同的。
https://stackoverflow.com/questions/29257562
复制相似问题