对象类型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到已知 托管提供程序本机类型。 此代码 选择索引已更改
我想异常是在
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 中的事件。在这些事件中,尚未分配DisplayMember
和ValueMember
。 在这种情况下,代码位于您当前正在分配DataSource
的ComboBox
的SelectedIndexChanged
中,因此该方法调用自身。但是,由于您首先分配了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"
这是相同的。