Как условно отключить поле данных подробного просмотра - PullRequest
2 голосов
/ 19 мая 2010

У меня есть элемент управления подробным просмотром ASP.Net. Его DataSourceId меняется, и я соответственно устанавливаю его в Page_load ... (на основе подтипов LLBLgen, но это не так уж важно)

Полагаю, это жизненный цикл страницы Утечка абстракции Я не "получаю".

Проблема в том, что я привязываюсь к полям, которые могут или не могут быть там в зависимости от источника данных ...

Чтобы «отключить» связанное поле при определенных условиях, я попытался обернуть связанное поле в панель, которую я установил видимым или невидимым в коде позади, но все равно получаю следующую ошибку:

Sys.WebForms.PageRequestManagerServerErrorException: DataBinding: объект не содержит свойства с именем FilePrefix.

Я изменил detaislview.datasourceid в загрузке страницы ... возможно, слишком поздно в жизненном цикле.

Я не хочу связываться с этим полем, поскольку оно не существует для нового источника данных, но тем не менее оно пытается сделать это, и я получаю ошибку.

Есть идеи? ;)

[Отредактировано]: Код по запросу ...

ASP, столбец с подробным обзором:

<asp:TemplateField>
<ItemTemplate>
<asp:Panel ID="pnlNormalAdditionalFields" runat="server" Visible="false">
    <asp:textbox id="txtFilePrefix" runat="server" MaxLength="250" Width="180px" text='<%# Bind("FilePrefix") %>'></asp:textbox>
    <asp:requiredfieldvalidator id="valFilePrefix" runat="server" errormessage="File Prefix is required." controltovalidate="txtFilePrefix">*</asp:requiredfieldvalidator>
</asp:Panel>
</ItemTemplate>
            </asp:TemplateField>

Кодовый код: (определите источник данных, detaislview виден при обратной передаче только при отображении сетки при начальной загрузке страницы.)

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack) //initial load
        {
        }
        else //postback
        {
            //set customdatasource for grid & detailsview 
            switch (radAccountType.SelectedValue)
            {
                case "Normal":
                    dvAccount.DataSourceID = "NormalCollectionDataSource";
                    AccountRadGrid.customDataSourceId = "NormalCollectionDataSource";
                    break;
                case "Reseller":
                    dvAccount.DataSourceID = "ResellerCollectionDataSource";
                    AccountRadGrid.customDataSourceId = "ResellerCollectionDataSource";
                    break;

...

Показать / скрыть панель:

        protected void dvAccount_OnPreRender(object sender, EventArgs e)
        {
            Panel pnlGroupStoreAdditionalFields = ControlHelper.FindControlFromTop(this, "pnlGroupStoreAdditionalFields", null) as Panel;

                pnlGroupStoreAdditionalFields.Visible = false;

                switch (radAccountType.SelectedValue)
                {
...
                    case "GroupStore":
                        ddlAccountType.SelectedValue = Constants.Account.Type.GroupStore;
                        pnlGroupStoreAdditionalFields.Visible = true;
                        break;
                }
            }

    }

1 Ответ

1 голос
/ 19 мая 2010

Вы не можете назначить инструкцию <% # Bind ("")%>, если поля там нет; вам придется программировать присваивать значение из-за-кода, если значение может или не может быть там ... используя findcontrol, чтобы найти элемент управления из конкретного элемента.

...