2015-08-21 3 views
0

У меня есть код для создания GridView. Он отображает штраф, за исключением столбца SenderDetails. Мне нужно создать шаблон элемента для этого. Message и Date DataFields принадлежат классу Chat, и они отображаются в сетке. Но SenderDetails вызывается из другого класса в классе чата:Как создать шаблон элемента/шаблон для динамического gridview

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 колонке.

Мне нужно отобразить UserName в 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}" }); 
} 

Как добавить шаблон или TemplateField пункт для вызова SenderDetails?

+0

Почему вы не строите это в своем коде веб-формы? Это действительно важно, что он построен динамически? – 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 в actall. – Lali

+0

благодарит за комментарии. Но я получаю ошибку Ошибка Ссылка на объект требуется для нестатического поля, метода или свойства «GridViewUtils.GridViewHelper.GetTemplateField (string)» в функции BuildChatsGrid() – user123456789