2010-05-19 58 views
1

我有一个ASP.Net detailsview控件。它的DataSourceId变化,我相应地设置在Page_load ...(基于LLBLgen子类型,但这不是太重要)如何有条件地禁用detailsview数据绑定字段

我想这是一个页面生命周期leaky abstraction我不是“得到”。

的问题是,我绑定到字段可能会或可能不会是有依据的数据源...

为“Disable”在一定条件下绑定的字段我已经试过包装在一个绑定字段面板,我设置为可见或不可见的代码隐藏,但我仍然得到以下错误:

Sys.WebForms.PageRequestManagerServerErrorException:DataBinding:实体不包含名称为'FilePrefix'的属性。

我更改pageload中的detaislview.datasourceid ...可能在生命周期中太晚了。

我不想绑定到该字段,因为它不存在新的数据源,但它试图做到这一点,我得到的错误。

任何想法? )

[被修改]:作为请求码...

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> 

代码隐藏:(确定数据源,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

你可以发布一些代码吗? – 2010-05-19 12:44:46

回答

0

如果该字段不存在,则不能指定<%#Bind(“”)%>语句;如果该值可能存在或可能不存在,那么您将不得不从程序代码中分配值...使用findcontrol从特定项目中找到控件。

+0

如何? protected void SomeField_OnDataBinding(object sender,EventArgs e) ((TextBox)sender).Text = Eval(“SomeField”)。ToString(); } 只有Eval()可用,而不是Bind()。 Eval是只读的,我需要能够将文本框中的值自动推回到数据库中...就像使用<%#Bind(“”)%> – Konrad 2010-05-20 08:22:48

+0

所做的那样,如果您需要自动推送那么您需要确保该字段在两个数据源中都存在,即使它在其他数据源中始终为空......这是我知道使用DataSourceID的唯一方式。 – 2010-05-20 11:50:42

+0

我会接受你的回答。我将不得不手动绑定在detailsview中的OnItemInserting/Updating事件...在那里我有更多的控制,并可以禁用这样的方式不需要的字段。 – Konrad 2010-05-20 14:39:13

相关问题