2015-08-21 51 views
0

我有一个代码来创建一个GridView。除SenderDetails列外,它显示正常。我需要为此创建一个项目模板。 MessageDate DataFields来自一个名为Chat的类,它们在网格中显示得很好。但SenderDetails从聊天类另一个类叫做:如何为动态gridview创建项目模板/ templatefield

public class Chat : BaseResultSet 
{ 
    public string Message { get; set; } 
    public DateTime? SentDate { get; set; } 
    public ChatUserDetails SenderDetails { get; set; } 
} 

ChatUserDetails类是:

public class ChatUserDetails : BaseDisplaySet 
{ 
    public string UserName { get; set; } 
    public string CompanyName { get; set; } 
    public bool Connected { get; set; } 
} 

因此,而不是显示它在SenderDetails列显示baseClasses.Chat.ChatUserDetails的用户名。

我需要在BuildChatsGrid()中显示用户名。 GridView控件代码:

public static GridView BuildChatsGrid() 
{ 
    GridView NewDg = new GridView(); 

    NewDg.Columns.Add(new BoundField { DataField = "Message", HeaderText = "Note" }); 
    NewDg.Columns.Add(new BoundField { DataField = "SenderDetails", HeaderText = "Entered By" }); //need item template 
    NewDg.Columns.Add(new BoundField { DataField = "SentDate", HeaderText = "Date", DataFormatString = "{0:dd/MM/yyyy}" }); 
} 

那么,如何添加项目模板或模板列调用SenderDetails

+0

你为什么不在你的web表单代码中构建这个?动态构建它是否势在必行? – TestWell

+0

@TestWell是的,它必须动态构建 – user123456789

+1

[这是我找到的链接](http://www.codeproject.com/Articles/13462/How-to-create-template-columns-dynamically-in-a-gr)看起来解决同一个问题。您将不得不调整模板以满足您的需求,但这是一个开始。看起来像任何模板必须来自'ITemplate' – TestWell

回答

2

您需要覆盖ITemplate接口。像

public class CreateItemTemplate : ITemplate 
{ 
    private ListItemType listItemType; 
    private string _ColumnName; 

    public CreateItemTemplate() { } 

    public CreateItemTemplate(ListItemType Item, string ColumnName) 
    { 
     listItemType = Item; 
     _ColumnName = ColumnName; 
    } 

    public void InstantiateIn(System.Web.UI.Control container) 
    { 
     if (listItemType == ListItemType.Item) 
     { 

      Label lblUserData = new Label(); 
      lblUserData.DataBinding += new EventHandler(DataFormatter); 
      container.Controls.Add(lblUserData); 
     } 
    } 
    void DataFormatter(object sender, EventArgs e) 
    { 
     //Here you can write logic to display data 
     Label lbl = (Label)sender; 
//(Below line)Here we are getting the container, that is GridViewRow which we are binding with our item template. Since there is a data source for this gridview (you surely assigned datasource), so each row will contain 'SenderDetails' object there. 
      GridViewRow container = (GridViewRow)lbl.NamingContainer; 
//Now we are extracting particular column data from GridViewRow object, we also know its type, that is ChatUserDetails 
     var objChatUserDetails = (ChatUserDetails)DataBinder.Eval(container.DataItem, _ColumnName); 
     if (objChatUserDetails != null) 
     { 
      lbl.Text = "UserName : " + objChatUserDetails.UserName + ", CompanyName : " + objChatUserDetails.CompanyName ; 
     } 
    } 
} 

现在修改您的BuildChatsGrid()函数

public static GridView BuildChatsGrid() 
{ 
    GridView NewDg = new GridView(); 

    NewDg.Columns.Add(new BoundField { DataField = "Message", HeaderText = "Note" }); 
    //NewDg.Columns.Add(new BoundField { DataField = "SenderDetails", HeaderText = "Entered By" }); //need item template 
    NewDg.Columns.Add(GetTemplateField("SenderDetails")); //Newly addded 
    NewDg.Columns.Add(new BoundField { DataField = "SentDate", HeaderText = "Date", DataFormatString = "{0:dd/MM/yyyy}" }); 
} 

现在创建上述功能GetTemplateField()在当前类像

public TemplateField GetTemplateField(string colName) 
{ 
    TemplateField tfObject = new TemplateField(); 
    tfObject.HeaderText = "Entered Byte"; 
    tfObject.ItemTemplate = new CreateItemTemplate(ListItemType.Item, colName); 
    return tfObject; 
} 

此功能调用的对象上面定义的CreateItemTemplate类。您可以在DataFormatter()函数中编写上面的数据显示逻辑。

+0

感谢您的答案。但我不明白'DataFormatter'如何从ChatUserDetails类中获取用户名。 'sDetail'应该引用什么? – user123456789

+0

我用评论修改了答案。请立即检查。 sDetail输入错误,它是实际的ChatUserDetails。 – Lali

+0

感谢您添加评论。但是出现错误错误 BuildChatsGrid()函数中的非静态字段,方法或属性'GridViewUtils.GridViewHelper.GetTemplateField(string)'需要对象引用 – user123456789