2009-01-31 17 views
7

tengo una serie de tablas en mi base de datos que contienen las referencias a un valor de par de claves:gridview lista desplegable se unen a la lista <KeyValuePair <int, string>>

tipos de números telefónicos:

  • 1 - Inicio
  • 2 - trabajo
  • 3 - Mobile
  • 4 - Fax

etc

Tengo una tabla para los tipos y cuando se usan en otras tablas hacen referencia al valor int como una clave externa. Cuando los saqué, los he almacenado como artículos keyvaluepair<int, string> en la clase que los está usando.

Cuando necesitaba obtener una lista de ellos, pensé que simplemente crearía una lista <> de ellos en lugar de utilizar dos tipos diferentes de tipos de datos para obtener los mismos datos.

Mi problema ha llegado cuando necesito completar una lista desplegable dentro de una vista de cuadrícula cuando estoy usando el bit edittemplate. Si utilizo una fuente de datos para extraer esto, escribirá [1 página principal] en el texto en lugar de poner el int como el valor y Home como el texto para mostrar.

Supongo que tengo una pregunta de varias partes realmente.

Uno:

¿Estoy siendo estúpido? ¿Es esta una manera realmente mala de sacar los datos y almacenarlos (la parte keyvaluepair)? ¿Debería estar almacenando todo en una tabla de datos? No me gustó poner todo en datatable. Tengo mi DAL en mi BLL y he tratado de encapsular todo como objetos o List<> de objetos en lugar de tablas de todo. La mayoría del tiempo esto ha funcionado bien.

Dos:

Si yo estaba usando algún objeto en lugar de una tabla de datos para unirse a mi ObjectDataSource de la lista desplegable, ¿cómo puedo ajustar el valor seleccionado en ese momento, en lugar de tener exactamente de tener el primer elemento de la lista ¿seleccionado?

EDITAR

Como se señaló más adelante que estaba siendo un idiota y sólo necesitaba para establecer el DataValueField y DataKeyField.

Para obtener la lista desplegable para unirse sólo tenía que hacer:

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

La razón por la que no vi que uno enseguida fue porque no estaba mostrando en mi intelisense pero cuando he escrito manualmente en, funcionó.

Respuesta

29

usar un diccionario < int, cadena > y defina el menú desplegable DataValueField a clave y DataTextField a Valor.

// 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 - pensé que tenía un fácil * * 30 puntos o menos, pero se me adelantó. Buen trabajo y buena respuesta! –

+1

Gracias ... que lo vinculó brillantemente ... también funcionó con una Lista <> de ellos. Pero supongo que en algunos aspectos, de todos modos, qué es un diccionario ... – Jon

+0

Olvidé establecer DataValueField y DataTextField. Causar mi valor y mostrar el texto de la lista desplegable es el mismo. ¡GRACIAS! –

0

y es mi método personalizado

// 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> 
Cuestiones relacionadas