Как я могу создать что-то вроде BoundField, которое будет работать в шаблонах FormView? - PullRequest
2 голосов
/ 22 августа 2011

Кажется, что элементы управления, такие как BoundField , работают только внутри контейнеров привязки данных, например, GridView , где есть повторяющиеся данные.Я хотел бы знать, как кодировать что-то вроде BoundField , которое будет работать, например, внутри ItemTemplate границы данных FormView .Посмотрите, насколько читабельнее MyFormViewBoundField ниже по сравнению с необработанным шаблонным способом сделать это.

Текущий способ сделать это:

<ItemTemplate>
    <div class="span-12 last">
        <dl class="name-value">
            <dt>Property Type</dt>
            <dd><%# Eval("property_type_full") %></dd>
        </dl>
    </div>
</ItemTemplate>

По сравнениючто я хочу сделать:

<ItemTemplate>
    <div class="span-12 last">
        <mystuff:MyFormViewBoundField LabelText="PropertyType" DataValueField="property_type_full" />
    </div>                
</ItemTemplate>

1 Ответ

3 голосов
/ 28 августа 2011

Вы можете сделать это с помощью простого серверного элемента управления и настроить его по необходимости.

public class DataBindField : CompositeControl
{
    private HtmlGenericControl dt;
    private HtmlGenericControl dd;

    public string LabelText { get; set; }

    public string DataValueField { get; set; }

    protected override void OnDataBinding(EventArgs e)
    {
        EnsureChildControls();
        base.OnDataBinding(e);

        object dataItem = DataBinder.GetDataItem(NamingContainer);
        if (dataItem != null)
        {
           dd.InnerText = DataBinder.Eval(dataItem, DataValueField) as string;
        }
        dt.InnerText = LabelText;
    }

    protected override void CreateChildControls()
    {
        base.CreateChildControls();
        var dl = new HtmlGenericControl("dl");
        dt = new HtmlGenericControl("dt");
        dd = new HtmlGenericControl("dd");

        dl.Controls.Add(dt);
        dl.Controls.Add(dd);

        Controls.Add(dl);
    }
}

Очевидно, что добавление поддержки ViewState или поддержки времени разработки требует больше работы, но это основы.

...