对象类型System.Data.DataRowView不存在映射?

时间:2015-03-25 13:48:06

标签: c# sql-server

我有这段代码

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

1 个答案:

答案 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中的事件。在这些活动中,尚未分配DisplayMemberValueMember。在这种情况下,代码位于您当前正在分配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; 只是{。}}。