2009-11-30 12 views
0

Compte tenu de la classe suivante ....fortement d'utiliser des données typé plutôt qu'une chaîne de se lier à une liste déroulante

namespace IMTool.Data 
{ 
    public partial class AllContracts 
    { 
     internal class Metadata 
     { 
      public int ContractId { get; set; } 
      [Required] 
      public string Name { get; set; } 
     } 
    } 
} 

et compte tenu de ce qui suit.

using (var context = new IMToolDataContext()) 
{ 
    ddlContracts.DataValueField = "ContractId"; 
    ddlContracts.DataTextField = "Name"; 
    ddlContracts.DataSource = context 
     .AllContracts 
     .OrderBy(o => o.Name); 
    ddlContracts.DataBind(); 
} 

Comment puis-je taper fortement la liste déroulante DataValue et les champs DataText? Fondamentalement, je ne veux pas utiliser une chaîne, mais plutôt le nom de la colonne de l'entité, j'utilise LinqToSql (puits PLinqo qui est un ensemble de modèles de codes pour générer mon datalayer) Quelqu'un peut-il aider?

Répondre

2

Créer un attribut personnalisé pour faire

internal class Metadata 
{ 
    [MappingColumn (Type="Key")] 
    public int ContractId { get; set; } 
    [Required] 
    [MappingColumn (Type="Name")] 
    public string Name { get; set; } 
} 

créer deux méthodes avec cette signature

string GetKeyColumName(Type type) //will perfom a loop on the type properties custom attribute and return the first with the type Key 

string GetNameColumnName(Type type)//will perfom a loop on the type properties custom attribute and return the first with the type Name 

et alimenter votre ddl comme ceci:

using (var context = new IMToolDataContext()) 
{ 
    ddlContracts.DataValueField = GetKeyColumnName(typeof(Metadata)); 
    ddlContracts.DataTextField = GetNameColumnName(typeof(Metadata)); 
    ddlContracts.DataSource = context 
     .AllContracts 
     .OrderBy(o => o.Name); 
    ddlContracts.DataBind(); 
} 

EDIT: La colonne l'attribut auquel je me réfère est l'attribut yourcunstom, pas celui de Linq. Ok je devrais l'avoir appelé MappingColumn il peut être déclaré comme ceci:

public class MappingColumnAttribute : System.Attribute 
{ 

    public string Type {get;set;} 
}