Как создать шаблон элемента / поле шаблона для динамического просмотра сетки

У меня есть код для создания 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().

Другие вопросы по тегам