2010-11-11 5 views
3

J'ai une base de données SQL Server avec une table, qui répertorie les noms de fichiers d'images. J'ai l'intention d'assigner ImageUrl d'un contrôle Image sur la page, à partir des données de la table. J'ai placé un contrôle SQLDataSource sur la page, puis j'ai essayé d'y placer un contrôle FormView et un contrôle Image dans celui-ci. Mais je ne vois pas comment je peux attribuer la valeur à la propriété ImageUrl via la liaison de données.Comment affecter dynamiquement la propriété ImageUrl d'une image à l'aide de la liaison de données?

Répondre

8

intérieur quel que soit le type de votre commande à l'aide de retourner les données que vous feriez quelque chose comme ...

<asp:imagebutton id="btnId" runat="server" ImageUrl='<%# Bind("ImgUrl") %>' /> 

Jouez avec cela et essayer ... la plupart de ce que je fais est en datagridviews ou répétiteurs ... mais cela n'a pas vraiment d'importance, c'est le lien ou l'évaluation qui compte.

Un peu plus d'informations pour vous Rod.

<asp:SqlDataSource 
     id="SqlDataSource1" 
     runat="server" 
     DataSourceMode="DataReader" 
     ConnectionString="<%$ ConnectionStrings:MyNorthwind%>" 
     SelectCommand="SELECT LastName FROM Employees"> 
    </asp:SqlDataSource> 

    <asp:SqlDataSource 
     id="SqlDataSource2" 
     runat="server" 
     DataSourceMode="DataReader" 
     ConnectionString="<%$ ConnectionStrings:MyNorthwind%>" 
     SelectCommand="SELECT FirstName FROM Employees"> 
    </asp:SqlDataSource> 


    <asp:ListBox 
     id="ListBox1" 
     runat="server" 
     DataTextField="LastName" 
     DataSourceID="SqlDataSource1"> 
    </asp:ListBox> 
    <asp:ListBox 
     id="ListBox2" 
     runat="server" 
     DataTextField="FirstName" 
     DataSourceID="SqlDataSource2"> 
    </asp:ListBox> 

Laissez-moi savoir si cela aide

+0

Au lieu de Bind vous devez utiliser Eval si elle est seulement pour l'affichage –

+0

je suis d'accord ... ne sachant pas exactement ce qu'il prévoit pour finalement, je suis figé, je commence par le bind. – Patrick

+0

Cela semble fonctionner, mais j'ai une question de suivi. J'ai 2 contrôles SqlDataSource sur la page. Comment la méthode Bind() va-t-elle savoir laquelle utiliser? – Rod

2

Une façon plus propre de faire ce genre de fixation, bien me nettoyant au moins, serait de gérer la liaison en cas ItemDataBound.

Alors vous feriez quelque chose comme:

Image imageToBind = e.Item.FindControl("imgTest") as Image; 
image.ImageUrl = (string)DataBinder.Eval(e.Item.DataItem, "ColumnName"); 

Je viens de trouver que, pour être plus élégant que de le faire dans le balisage réel.

+0

Je ne pense pas qu'il soit plus propre à ajouter et EventHandler et ajouter deux lignes de code qui traite les identifiants des contrôles comme des chaînes et utilise cast dans codebehind quand un seul attribut dans le balisage est suffisant. Cette solution: impérative. La solution de Patrick: Plus déclarative –

+2

Subjective alors je suppose. Chaque fois que je vois un répéteur avec Eval/Bind partout, ça me gêne. Je pense que la manipulation derrière le code est juste plus propre et plus facile à voir/comprendre. –

1

.aspx.cs

public string GetImage(string status) 
    { 
     if (status=="Active") 

      return "~/images/green_acti.png"; 

     else 

      return "~/images/red_acti.png"; 

    } 

.aspx

<asp:TemplateField HeaderText="|| Status ||"> 
      <ItemTemplate> 
       <asp:Image ID="imgGreenAct" ImageUrl='<%# GetImage(Convert.ToString(DataBinder.Eval(Container.DataItem, "truck_status")))%>' AlternateText='<%# Bind("truck_status") %>' runat="server" />        
      </ItemTemplate> 
</asp:TemplateField>