2010-07-30 11 views
1

Dans mon application ASP.NET, j'ai un GridView. Pour un champ particulier dans ce GridView, j'ai ajouté un EditItemTemplate avec un DropDownList. Cependant, si la valeur du champ est "X", alors je veux simplement afficher une étiquette à la place de DropDownList. Alors, comment puis-je vérifier par programme la valeur du champ, puis décider quel contrôle afficher?Comment puis-je déterminer par programme quel contrôle utiliser dans mon EditItemTemplate? (ASP.NET)

Voici mon EditItemTemplate:

<EditItemTemplate> 

<asp:DropDownList ID="DropDownListLevel_ID" runat="server" 
    DataSourceID="ODSTechLvl" DataTextField="Level_Name" 
    DataValueField="Level_ID" SelectedValue='<%# Bind("Level_ID", "{0}") %>'> 
</asp:DropDownList> 

</EditItemTemplate> 

Si la valeur de Level_ID est "X", je veux utiliser:

<asp:Label ID="LabelLevel_ID" runat="server" Text='<%# Bind("Level_ID") %>'></asp:Label> 

au lieu du DropDownList.

J'ai essayé d'incorporer une instruction if avant le DropDownList pour vérifier Eval ("Level_ID"), mais cela ne semble pas fonctionner. Des pensées?

Répondre

0

Voici quelque chose qui fonctionnera pour ASP.Net.

Vous pouvez créer un événement RowDataBound et cacher l'étiquette ou la DropDownList

<asp:GridView id="thingsGrid" runat="server" OnRowDataBound="thingsGrid_RowDataBound" 

...> ...

et dans votre code derrière:

protected void thingsGrid_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 

     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      var boundData = e.Row.DataItem; 
      ... 
      if (boundDataMeetsCondition) 
      { 
       e.Row.Cells[4].FindControl("editThingDropDownList").Visible = false; 
       e.Row.Cells[4].FindControl("editThingLabel").Visible = true;//* 
      } 
      else 
      { 
       ...  
      } 
     } 
} 

* Notez que cela est moins qu'idéal car il code dur l'index de la cellule, et l'ID des contrôles est une chaîne qui ne sera pas vérifiée jusqu'à l'exécution. Il existe des moyens beaucoup plus élégants pour résoudre ce problème dans asp.net mvc. Le OnRowDataBound est un marteau qui vous donnera un accès complet à votre grille, les méthodes de la page, et l'ensemble de votre application.

Dans un scénario très simple, vous pouvez également le faire en ligne sans impliquer le codebehind.

<asp:Label ID="Label1" runat="server" Visible='<%# Convert.ToBoolean(Eval("BooleanPropertyInData"))%>' Text='<%# Eval("PropertyInData") %>'></asp:Label>       

ou

<asp:Label ID="Label1" runat="server" Visible='<%# Eval("PropertyInData").ToString()=="specialValue"%>' Text='<%# Eval("PropertyInData") %>'></asp:Label> 

dans la première approche en ligne, source de données doit exposer une telle propriété, et dans le second, vous êtes dur coder votre logique métier specialValue dans votre présentation, qui est aussi laid et conduira à des problèmes de maintenabilité.

1

Essayez ceci:

<EditItemTemplate> 

<asp:DropDownList ID="DropDownListLevel_ID" runat="server" 
    DataSourceID="ODSTechLvl" DataTextField="Level_Name" 
    DataValueField="Level_ID" SelectedValue='<%# Bind("Level_ID", "{0}") %>' 
    Visible='<%# Eval("Level_ID") != "X" %>'> 
</asp:DropDownList> 

<asp:Label ID="LabelLevel_ID" runat="server" Text='<%# Bind("Level_ID") %>' 
    Visible='<%# Eval("Level_ID") == "X" %>'></asp:Label> 

</EditItemTemplate>