Как создать шаблон элемента / поле шаблона для динамического просмотра сетки
У меня есть код для создания 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; }
}
Таким образом, вместо отображения имени пользователя он отображает baseClasses.Chat.ChatUserDetails
в SenderDetails
колонка.
Мне нужно отобразить имя пользователя в 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
?
1 ответ
Вам необходимо переопределить интерфейс 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().