我尝试阅读所有文章,并尝试了解决方案,但也不适合我。
我试过的其中一个解决方案
Binding Generic List Array to GridView
我使用您的tweeked示例代码创建的新项目文件如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SharePointProject2
{
public class abc
{
public string customername { get; set; }
public List<def> DEF { get; set; }
}
public class def
{
public string materialcode { get; set; }
}
}
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections.Generic;
namespace SharePointProject2.testing
{
public partial class testingUserControl : UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
List<abc> test1 = new List<abc>();
List<def> test2 = new List<def>();
test2.Add(new def() { materialcode = "something" });
test1.Add(new abc() { customername = "anything", DEF = test2 });
GridView1.DataSource = test1;
GridView1.DataBind();
}
}
}
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="asp" Namespace="System.Web.UI" Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="testingUserControl.ascx.cs" Inherits="SharePointProject2.testing.testingUserControl" %>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="Charge Code">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# ((List<def>)(Eval("DEF")))[0].materialcode %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
当我编译上面的代码时,这就是错误消息
找不到类型或命名空间名称'def'(您是否缺少using指令或程序集引用?)
答案 0 :(得分:1)
编辑:抱歉,我误解了你的很多问题。你的例子根本没有编译,所以我做了一个快速测试应用程序示例来说明解决方案:
public class def { public string materialcode{get;set;} }
public class abc
{
public string customername { get; set; }
public List<def> DEF { get; set; }
}
List<abc> test1 = new List<abc>();
List<def> test2 = new List<def>();
test2.Add(new def() { materialcode = "something" });
test1.Add(new abc() { customername = "anything", DEF = test2 });
grdTest.DataSource = test1;
grdTest.DataBind();
我已经测试了上述内容并且有效。如果您需要任何澄清,请发表评论。
编辑:以下内容应该让您启动并运行,在我看来,这是一种更简洁的方式来实现自定义绑定,并允许您更轻松地调试问题。
将Label
中的ItemTemplate
更改为以下内容:
<asp:Label ID="lblchargecode" runat="server"
Text='' OnDataBinding="lblchargecode_DataBinding"></asp:Label>
将DataBinding
方法添加到您的代码隐藏中:
protected void lblchargecode_DataBinding(object sender, System.EventArgs e)
{
Label lbl = (Label)sender;
lbl.Text = ((List<def>)(Eval("DEF")))[0].materialcode;
}
另外请务必检查您的包含。您需要确保您的代码知道def
类,因此请在必要时包含using
语句或完全限定它。
答案 1 :(得分:0)
将其更改为
<asp:TemplateField HeaderText="Charge Code">
<ItemTemplate>
<asp:Label ID="lblchargecode" runat="server" Text='<%# ((List<def>) Eval("DEF"))[0].materialcode %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
Eval返回对象,您必须将其转换为原始类型,然后使用它。