我有这个非常随意的问题就是烦我。它在一天结束时工作,但问题花了一些时间来弄清楚,并想知道为什么会发生这种情况,所以如果有人对这个问题有所了解,我将非常感激。这是问题
我的数据网格上有以下两列
<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;
}
你走了,这几乎是开始的结束。
答案 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的更多详细信息,我们可以为您提供帮助。