2010-05-19 15 views
1

J'ai un contrôle de vue détaillée ASP.Net. Son DataSourceId varie et je le place dans Page_load en conséquence ... (basé sur les sous-types LLBLgen, mais ce n'est pas trop important)Comment désactiver de manière conditionnelle un champ de base de données detailview

Je suppose que c'est un cycle de vie de page leaky abstraction Je ne suis pas "getting".

Le problème est que je lie aux champs qui peuvent ou peuvent ne être là en fonction de la source de données ...

Pour « désactiver » un champ lié dans certaines conditions que j'ai essayé envelopper le champ lié dans une panneau que j'ai défini à visible ou invisible dans code-behind, mais j'obtiens toujours l'erreur suivante:

Sys.WebForms.PageRequestManagerServerErrorException: DataBinding: Entity ne contient pas une propriété avec le nom 'FilePrefix'.

Je change le detaislview.datasourceid en pageload ... pourrait être trop tard dans le cycle de vie.

Je ne veux pas me lier à ce champ, car il n'existe pas pour la nouvelle source de données, mais il essaie de le faire tout de même et j'obtiens l'erreur.

Des idées? ;)

[Edited]: Code comme demandé ...

ASP, colonne liée de 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 sous-jacent: (déterminer la source de données, detaislview est visible seulement lors de la publication en grille est . affiché en charge de la page initiale)

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; 

...

Afficher/panneau cacher:

 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

Pourriez-vous poster un message s'il vous plait? –

Répondre

0

Vous ne pouvez pas attribuer <% # Bind ("")%> déclaration si le champ est pas là; vous auriez à assigner la valeur de code-behind par programmation si la valeur peut ou ne peut pas être là ... en utilisant findcontrol pour trouver le contrôle de l'élément spécifique.

+0

Comment? protected void SomeField_OnDataBinding (expéditeur d'objet, EventArgs e) { (expéditeur (TextBox)) .Text = Eval ("SomeField"). ToString(); } Seul Eval() est disponible, pas Bind(). Eval est en lecture seule, je dois être en mesure de pousser automatiquement la valeur dans la zone de texte dans la base de données ... comme cela est fait avec <% # Bind ("")%> – Konrad

+0

OK, si vous avez besoin de la poussée automatique En arrière, vous devez vous assurer que ce champ existe dans les deux sources de données, même s'il est toujours NULL dans l'autre source de données ... C'est le seul moyen que je connaisse d'utiliser DataSourceID. –

+0

Je vais accepter votre réponse. Je vais devoir lier manuellement dans l'événement detailsItemInserting/Updating ... là j'ai plus de contrôle et peux désactiver les champs non requis de cette façon. – Konrad