如何为动态网格视图创建项目模板/templatefield
本文关键字:项目 templatefield 创建 视图 动态 网格 | 更新日期: 2023-09-27 18:09:11
我有一个代码来创建GridView。除了SenderDetails
列,它显示得很好。我需要为此创建一个项目模板。Message
和Date
数据字段来自一个称为Chat
的类,它们在网格中显示得很好。但是SenderDetails
是从聊天类中的另一个类调用的:
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()
中显示UserName。显示数据表格代码:
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}" });
}
那么我如何添加一个项目模板或templatefield来调用SenderDetails
呢?
您需要覆盖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()函数中编写数据显示逻辑。