Изменение отображения поля ASP.NET DetailsView для режима редактирования и вставки стихов

Для ASP.NET я использую DetailsView для вставки и редактирования записи. В режиме редактирования я не хочу отображать поле первичного ключа, потому что его не следует изменять. Для режима вставки я хочу отобразить поле первичного ключа, потому что оно не существует, и пользователь может указать его через DropDownList, который гарантирует, что они выберут уникальное значение. TemplateField используется в разметке DetailsView для поля первичного ключа (отсюда и DropDownList для режима вставки).

Моя проблема в том, что я не могу заставить поле первичного ключа не отображаться в режиме редактирования и отображаться в режиме вставки. В разметке у меня есть:

<asp:TemplateField HeaderText="name" InsertVisible="True" Visible="True">
    <InsertItemTemplate>
        <asp:DropDownList ID="ddl2NonMembers" runat="server"
            Width="155px" 
            Sourceless="sqlNonMembers" 
            DataTextField="name" 
            DataValueField="id_adm" 
            SelectedValue='<%# Bind("member_grp") %>'>
        </asp:DropDownList>
    </InsertItemTemplate>
</asp:TemplateField>

С TemplateField Visible="True" HeaderText="name" всегда отображается то, что мне не нужно для режима редактирования. С TemplateField Visible="False" поле никогда не отображается, что мне не нужно для режима вставки.

Как я могу добиться поведения отображения, которое я хочу для режима редактирования вставки стихов. Я согласен с программным изменением некоторых свойств, а не с использованием чистой разметки, но я не могу найти решение.

Пожалуйста, порекомендуйте!


person harrije    schedule 18.07.2010    source источник


Ответы (1)


вы можете протестировать режим просмотра сведений и посмотреть, находится ли он в режиме редактирования. Затем вы можете программно скрыть DropDownList.

if (myDetailsView.CurrentMode == DetailsViewMode.Edit) 
{
    DropDownList ddl2NonMembers = (DropDownList)myDetailsView.FindControl("ddl2NonMembers");
    ddl2NonMembers.Visible = false;
}

Кроме того, вы можете скрыть весь столбец, но вам нужно знать индекс этого столбца. Предполагая, что индекс столбца равен # 5, вы можете сделать что-то вроде:

if (myDetailsView.CurrentMode == DetailsViewMode.Edit) 
{
    myDetailsView.Columns[5].Visible = false;
}

И, наконец, вы можете создать функцию в Code-Behind, которая проверяет текущее значение DetailsView и присваивает его свойству Visible вашего поля Template:

public bool showPKField() {
    bool result = true;
    if(myDetailsView.CurrentMode == DetailsViewMode.Edit)
        result = false;
    return result;
}

И внутри вашего поля шаблона:

<asp:TemplateField HeaderText="name" InsertVisible="True" Visible='<%# showPKField() %>'>
person Marko    schedule 18.07.2010
comment
Мне нужно было переключить, может ли весь столбец быть видимым, поэтому я выбрал второй вариант, однако мне пришлось использовать myDetailsView.Fields[5].Visible = false (в разметке TemplateField находится внутри тега ‹Field›, ‹ Столбец› предназначен для GridView). - person harrije; 18.07.2010
comment
Извините, я не проверял это в VS, да, это коллекция Fields. Виноват :) - person Marko; 18.07.2010
comment
Я не знал о свойстве InsertVisible. Это сработало для меня, я превратил его в False. +1 - person Brabbeldas; 11.09.2013