2 nicoleting nicoleting 于 2013.10.08 15:11 提问

C# 数据库 gridview问题
DataBinding:“System.Data.DataRowView”不包含名为“vcompanyname”的属性。

百度的大多数答案的意思是查询生成的ds中没有vcompanyname字段,但我的查询语句确实是有的,有还人说的session的问题,但没具体解释原因或者解决方案。

问题具体如下:
表1 公司表,从公司表的联系人,链接到联系人对应的表2 联系人信息表。vcompanyname均不是2表主键。

<asp:HyperLinkField HeaderText="联系人" DataNavigateUrlFields="vcompanyname" DataNavigateUrlFormatString="~/companycontrast/List.aspx?id={0}" 
                        Text="联系人"  />

表2的gridview是动软生成的,这部分代码在生成表1时用过,是可用的,但在表2时出问题了。

Maticsoft.BLL.companycontrast bll = new Maticsoft.BLL.companycontrast();
    public string strid = ""; 
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            gridView.BorderColor = ColorTranslator.FromHtml(Application[Session["Style"].ToString() + "xtable_bordercolorlight"].ToString());
            gridView.HeaderStyle.BackColor = ColorTranslator.FromHtml(Application[Session["Style"].ToString() + "xtable_titlebgcolor"].ToString());
            btnDelete.Attributes.Add("onclick", "return confirm(\"你确认要删除吗?\")");
            if (Request.Params["id"] != null && Request.Params["id"].Trim() != "")
            {
                strid = Request.Params["id"];

            }
            BindData(strid.Trim());
        }
    }

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        BindData(strid.Trim());
    }

    protected void btnDelete_Click(object sender, EventArgs e)
    {
        string idlist = GetSelIDlist();
        if (idlist.Trim().Length == 0) 
            return;
        bll.DeleteList(idlist);
        BindData(strid.Trim());
    }

    #region gridView

    public void BindData(string vcompanyname)
    {
        #region
        //if (!Context.User.Identity.IsAuthenticated)
        //{
        //    return;
        //}
        //AccountsPrincipal user = new AccountsPrincipal(Context.User.Identity.Name);
        //if (user.HasPermissionID(PermId_Modify))
        //{
        //    gridView.Columns[6].Visible = true;
        //}
        //if (user.HasPermissionID(PermId_Delete))
        //{
        //    gridView.Columns[7].Visible = true;
        //}
        #endregion

        DataSet ds = new DataSet();
       /* StringBuilder strWhere = new StringBuilder();
        if (txtKeyword.Text.Trim() != "")
        {      
            #warning 代码生成警告:请修改 keywordField 为需要匹配查询的真实字段名称
            strWhere.AppendFormat("keywordField like '%{0}%'", txtKeyword.Text.Trim());
        }    */
        string strWhere = "vcompanyname = '" + vcompanyname + "'";
        ds = bll.GetList(strWhere.ToString());            
        gridView.DataSource = ds;
        gridView.DataBind();
    }

    protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        gridView.PageIndex = e.NewPageIndex;
        BindData(strid.Trim());
    }
    protected void gridView_OnRowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Header)
        {
            //e.Row.Cells[0].Text = "<input id='Checkbox2' type='checkbox' onclick='CheckAll()'/><label></label>";
        }
    }
    protected void gridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        e.Row.Attributes.Add("style", "background:#FFF");
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            LinkButton linkbtnDel = (LinkButton)e.Row.FindControl("LinkButton1");
            linkbtnDel.Attributes.Add("onclick", "return confirm(\"你确认要删除吗\")");

            //object obj1 = DataBinder.Eval(e.Row.DataItem, "Levels");
            //if ((obj1 != null) && ((obj1.ToString() != "")))
            //{
            //    e.Row.Cells[1].Text = obj1.ToString();
            //}

        }
    }

    protected void gridView_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        //#warning 代码生成警告:请检查确认真实主键的名称和类型是否正确
        //int ID = (int)gridView.DataKeys[e.RowIndex].Value;
        //bll.Delete(ID);
        //gridView.OnBind();
    }

    private string GetSelIDlist()
    {
        string idlist = "";
        bool BxsChkd = false;
        for (int i = 0; i < gridView.Rows.Count; i++)
        {
            CheckBox ChkBxItem = (CheckBox)gridView.Rows[i].FindControl("DeleteThis");
            if (ChkBxItem != null && ChkBxItem.Checked)
            {
                BxsChkd = true;
                //#warning 代码生成警告:请检查确认Cells的列索引是否正确
                if (gridView.DataKeys[i].Value != null)
                {                        
                    idlist += gridView.DataKeys[i].Value.ToString() + ",";
                }
            }
        }
        if (BxsChkd)
        {
            idlist = idlist.Substring(0, idlist.LastIndexOf(","));
        }
        return idlist;
    }

    #endregion





}

代码运行到 gridView.DataBind();时报错。
单步跟踪到这里时:
connection.Open();
SqlDataAdapter command = new SqlDataAdapter(SQLString, connection);
command.Fill(ds, "ds");
无法查看返回数据集ds中数据,但所涉及所有字段数据库中均存在,测试查询内容在数据库中也存在。

1个回答

nicoleting
nicoleting   2013.10.08 16:21
已采纳

我自己调试解决了。
我的还是字段的问题
绑定的关键字段,在查询条件中必须有,并且字符形式保持一致。
我的关键字是vcompanyname,所以select语句中必须有vcompanyname .(原来vcompanyname不是我需要的查询项)。
注意字段属性中datafield和sortexpression的区别与联系。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!