ASP中的Eval与DataField:Datagrid

时间:2010-02-10 13:00:42

标签: asp.net datagridview

我有这个非常随意的问题就是烦我。它在一天结束时工作,但问题花了一些时间来弄清楚,并想知道为什么会发生这种情况,所以如果有人对这个问题有所了解,我将非常感激。这是问题

我的数据网格上有以下两列

<asp:boundcolumn
datafield="contentsection.Id"
headerstyle-cssclass="dgHead"
headertext="Section"
itemstyle-cssclass="dgItem" />

<asp:templatecolumn>
<itemtemplate><%#Eval("contentsection.Id") %></itemtemplate>
</asp:templatecolumn>

第一栏给出了错误:

在所选数据源上找不到名称为“contentsection.Id”的字段或属性

但第二次运行正常。关于为什么会发生这种情况的任何想法或理论?

我调用和绑定数据的方式如下:

页面加载代码背后

ContentList.DataSource = ContentBlockManager.GetList();
ContentList.DataBind();

GetList()函数它被重载并默认传递0

public static List<ContentBlockMini> GetList(int SectionId)
{
    List<ContentBlockMini> myList = null;

    SqlParameter[] parameters = { new SqlParameter("@ContentSectionId", SectionId) };

    using (DataTableReader DataReader = DataAccess.GetDataTableReader("dbo.contentblock_get", parameters))
    {
        if (DataReader.HasRows)
        {
            myList = new List<ContentBlockMini>();
        }
        while (DataReader.Read())
        {
            myList.Add(FillMiniDataRecord(DataReader));
        }
    }

    return myList;
}

和我填写的数据记录。 ContentSection是另一个Object,它是ContentBlock对象的属性

private static ContentBlockMini FillMiniDataRecord(IDataRecord DataRecord)
        {
            ContentBlockMini contentblock = new ContentBlockMini();

            contentblock.Id = DataRecord.GetInt32(DataRecord.GetOrdinal("Id"));
            contentblock.Name = DataRecord.GetString(DataRecord.GetOrdinal("Name"));
            contentblock.SEOKeywords = DataRecord.IsDBNull(DataRecord.GetOrdinal("SEOKeywords")) ? string.Empty : DataRecord.GetString(DataRecord.GetOrdinal("SEOKeywords"));
            contentblock.SEODescription = DataRecord.IsDBNull(DataRecord.GetOrdinal("SEODescription")) ? string.Empty : DataRecord.GetString(DataRecord.GetOrdinal("SEODescription"));
            if (DataRecord.GetInt32(DataRecord.GetOrdinal("ContentSectionId")) > 0)
            {
                ContentSection cs = new ContentSection();
                cs.Id = DataRecord.GetInt32(DataRecord.GetOrdinal("ContentSectionId"));
                cs.Name = DataRecord.IsDBNull(DataRecord.GetOrdinal("ContentSectionName")) ? string.Empty : DataRecord.GetString(DataRecord.GetOrdinal("ContentSectionName"));
                contentblock.contentsection = cs;

            }
            return contentblock;
        }

你走了,这几乎是开始的结束。

4 个答案:

答案 0 :(得分:2)

数据绑定只能访问对象的“顶级”属性。例如,如果我的对象是 具有简单属性CompanyId和Name以及Address的子对象的公司,数据绑定只能访问CompanyId和Name,而不能访问Company.Address.City。

如果使用@Import page directive导入命名空间,Eval可以访问子对象属性。

答案 1 :(得分:1)

DataField属性方法不够复杂,无法支持点表示法;它希望在您的基础数据源中直接引用;它需要该字段并检查数据源,它无法通过确切的字符串找到它。

第二种方法,eval,更具动态性,但实际上我不确定它是否支持点符号...每天都要学习。

HTH。

答案 2 :(得分:1)

“绑定”标记是双向绑定,使用附加到对象数据源的默认命名空间进行。这不能被覆盖,并且由于这种紧密耦合的连接,命名空间应该被假设(因为它是从数据源动态提取的)。

Eval是一种单向绑定,可以与任何能够实现正确评估的命名空间一起使用。日期,字符串,方法调用等。示例中提供的命名空间仅为eval提供了一个标记,指示数据的相关位置。

这里的关键是绑定的性质。 Eval是一种“即发即忘”的绑定方式,因为Bind更加僵硬,不利于双向。

答案 3 :(得分:0)

有必要查看您的DataSource,但您可以进行简单的测试:将第一列转换为模板列,尝试运行。

在EntityFramework中可以使用以下代码进行Eval属性:&lt;%#Eval(“Customer.Address.PostalCode”)%&gt;。

我不知道是否是您的情况,但如果您提供有关如何检索DataSource的更多详细信息,我们可以为您提供帮助。