首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对象类型System.Data.DataRowView不存在映射?

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

Stack Overflow用户
提问于 2015-03-25 13:48:05
回答 1查看 2.3K关注 0票数 3

我有这个密码

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-25 13:51:53

我想例外情况是在

代码语言:javascript
运行
复制
scm.Parameters.AddWithValue("@dept_id",cmb_public_manag.SelectedValue);

cmb_public_manag.SelectedValue不是int,而是DataRowView。然后使用:

代码语言:javascript
运行
复制
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。在本例中,代码位于当前正在分配的SelectedIndexChangedComboBox中,因此该方法调用自己。但是,由于您已经首先分配了DataSource,所以ValueMember是未分配的,整个对象都是从SelectedValue返回的。

因此,请使用以下代码:

代码语言:javascript
运行
复制
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",这是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29257562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档