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

本文关键字:不存在 映射 DataRowView Data 类型 System 对象 | 更新日期: 2025-01-25 09:13:07

我有这个代码

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到已知 托管提供程序本机类型。 此代码 选择索引已更改

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

我想异常是在

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作为最后一步,因为这可能会导致 winform 中的事件。在这些事件中,尚未分配DisplayMemberValueMember。 在这种情况下,代码位于您当前正在分配DataSourceComboBoxSelectedIndexChanged中,因此该方法调用自身。但是,由于您首先分配了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"这是相同的。

相关文章: