2009-01-31 5 views
7

J'ai un certain nombre de tables dans ma DB qui détiennent des références à une valeur paire de clés:dropdownlist se lient gridview à la liste <KeyValuePair <int, string>>

types de numéros de téléphone:

  • 1 - Accueil
  • 2 - travaux
  • 3 - mobile
  • 4 - Fax

etc

J'ai donc une table pour les types et quand ils sont utilisés dans d'autres tables, ils font référence à la valeur int en tant que clé étrangère. Quand je les ai sortis, je les ai stockés sous la forme keyvaluepair<int, string> dans la classe qui les utilise. Quand j'ai eu besoin d'obtenir une liste d'entre eux, j'ai pensé que je devrais simplement créer une liste plutôt que d'utiliser deux types de types de données différents pour obtenir les mêmes données.

Mon problème est survenu lorsque j'ai besoin de remplir une liste déroulante dans une grille lorsque j'utilise le bit edittemplate. Si j'utilise une source de données pour l'extraire, j'écrirai [1 ​​Home] dans le texte plutôt que de mettre int comme valeur et Home comme texte à afficher. Je suppose que j'ai vraiment une question à plusieurs parties.

One:

Suis-je stupide? Est-ce un très mauvais moyen de sortir les données et de les stocker (la partie keyvaluepair)? Devrais-je simplement stocker tout dans un datatable? Je n'aimais pas tout mettre dans datatable. J'ai mon DAL prenant à mon BLL et ai essayé d'encapsuler tout comme des objets ou des objets plutôt que des tables de tout. La plupart du temps cela a bien fonctionné.

Deux:

Si j'utilisais un objet plutôt qu'un datatable à lier dans mon ObjectDataSource pour le dropdownlist, comment puis-je régler la valeur sélectionnée, plutôt que de le faire ont juste le premier élément de la liste choisi?

EDIT

Comme nous l'avons souligné ci-dessous, j'étais un idiot et juste besoin de régler la DataValueField et DataKeyField.

Pour obtenir le dropdownlist à lier je devais juste faire:

SelectedValue='<%# DataBinder.Eval(Container, "DataItem.PhoneType.Key") %>' 

La raison pour laquelle je ne voyais pas que l'on était loin droit parce qu'il ne montrait pas dans mon IntelliSense mais quand je tapais manuellement dedans, ça a marché.

Répondre

29

Utilisez un dictionnaire < int, string > et de définir votre DropDown DataValueField à Key et DataTextField à Valeur.

// A sample dictionary: 
    var dictionary = new Dictionary<int, string>(); 
    dictionary.Add(1, "Home"); 
    dictionary.Add(2, "Work"); 
    dictionary.Add(3, "Mobile"); 
    dictionary.Add(4, "Fax"); 

    // Binding the dictionary to the DropDownList: 
    dropDown.DataTextField = "Value"; 
    dropDown.DataValueField = "Key"; 
    dropDown.DataSource = dictionary; //Dictionary<int, string> 
    dropDown.DataBind(); 
+0

Dayam - Je pensais avoir un * facile * 30 points environ, mais vous me battre pour elle. Beau travail et bonne réponse! –

+1

Merci .. qui l'a lié brillamment .. il a travaillé avec une liste <> d'eux aussi. Mais je suppose à certains égards que ce qu'est un dictionnaire de toute façon ... – Jon

+0

J'ai oublié de définir DataValueField et DataTextField .. Provoquant ma valeur et afficher Le texte de la liste déroulante est identique. MERCI! –

0

et sa ma méthode personnalisée

// Define enum 
public enum ServiceType : int 
{ 
    MinimumService = 1, 
    NormalService = 2, 
    VipService = 99 
} 

// custom method to get my custom text name for each enum type 
public string GetServiceTypeName(ServiceType serviceType) 
{ 
    string retValue = ""; 
    switch (serviceType) 
    { 
     case ServiceType.Print: 
      retValue = "We have some services for you"; 
      break; 
     case ServiceType.BookBinding: 
      retValue = "We ar glad to meet you"; 
      break; 
     default: 
      retValue = "We alywas are ready to make you happy"; 
      break; 
    } 
    return retValue; 
} 

// making dictionary (key and value) for dropdown datasource 
public static Dictionary<string, int> GetAllServiceTypeName() 
{ 
    Dictionary<string, int> dataSource = new Dictionary<string, int>(); 

    foreach (int item in Enum.GetValues(typeof(ServiceType))) 
     dataSource.Add(GetServiceTypeName((ServiceType)item), item); 

    return dataSource; 
} 


    // bind the dropdown to dictionary 
    ddlServiceType.DataSource = GetAllServiceTypeName(); 
    ddlServiceType.DataBind(); 

    // aspx markup code sample 
    <asp:DropDownList ID="ddlServiceType" runat="server" 
     DataTextField="Key" DataValueField="Value"> 
    </asp:DropDownList> 
Questions connexes