c# - gridview bind lista desplegable para List<keyvaluePair<int, string>>
.net asp.net (2)
Tengo varias tablas en mi base de datos que contienen referencias a un par de valores clave:
tipos de números telefónicos:
- 1 - Inicio
- 2 - Trabajo
- 3 - Móvil
- 4 - Fax
etc
Así que tengo una tabla para los tipos y cuando se usan en otras tablas hacen referencia al valor int como una clave foránea. Cuando los he estado sacando los he almacenado como elementos keyvaluepair<int, string>
en la clase que los está utilizando.
Cuando necesitaba obtener una lista de ellos, pensé que simplemente crearía una Lista <> de ellos en lugar de usar dos tipos diferentes de tipos de datos para obtener los mismos datos.
Mi problema ha llegado cuando necesito llenar 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 estuviese utilizando algún objeto en lugar de una tabla de datos para vincularlo a mi objectdatasource para la lista desplegable, ¿cómo puedo establecer el valor seleccionado actualmente, en lugar de tener solo el primer elemento de la lista seleccionado?
EDITAR
Como se señaló a continuación, estaba siendo un idiota y solo necesitaba configurar DataValueField y DataKeyField.
Para hacer que la lista desplegable se una, solo tuve que hacer:
SelectedValue=''<%# DataBinder.Eval(Container, "DataItem.PhoneType.Key") %>''
La razón por la que no lo vi inmediatamente fue porque no estaba apareciendo en mi intellisense, pero cuando lo escribí manualmente, funcionó.
Utilice un Dictionary <int, string> y establezca DropDown DataValueField en Key y DataTextField en Value .
// 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();
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>