2010-05-19 3 views
1

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

Я думаю, что это жизненный цикл страницы leaky abstraction Я не «получаю».

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

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

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

Я изменяю detaislview.datasourceid в pageload ... может быть, слишком поздно на жизненном цикле.

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

Любые идеи? ;)

[Изменено]: Код по запросу ...

ASP, DetailsView связанный столбец:

<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> 

Code-за: (определить источник данных, 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; 
       } 
      } 

    } 
+0

Не могли бы вы выслать какой-нибудь код, пожалуйста? –

ответ

0

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

+0

Как? protected void SomeField_OnDataBinding (отправитель объекта, EventArgs e) { ((TextBox) отправитель) .Text = Eval ("SomeField"). ToString(); } Доступен только Eval(), а не Bind(). Eval доступен только для чтения, мне нужно иметь возможность автоматически перетаскивать значение в текстовое поле обратно в базу данных ... как это делается с помощью <% # Bind ("")%> – Konrad

+0

OK, если вам нужен автоматический толчок назад, то вам нужно убедиться, что поле существует в обоих источниках данных, хотя оно всегда является нулевым в другом источнике данных ... это единственный способ, которым я знаю использование DataSourceID. –

+0

Я приму свой ответ. Мне нужно будет вручную привязать к событию OnItemInserting/Updating detailview ... там у меня больше контроля и вы можете отключить поля, которые не требуются таким образом. – Konrad

Смежные вопросы