2009-01-31 3 views
7

У меня есть несколько таблиц в моей БД, которые содержат ссылки на ключевую пару значений:GridView связывает DropDownList к списку <KeyValuePair <int, string>>

типов телефонных номеров:

  • 1 - Главная
  • 2 - Работа
  • 3 - Мобильный
  • 4 - Факс

etc

Итак, у меня есть таблица типов, и когда они используются в других таблицах, они ссылаются на значение int в качестве внешнего ключа. Когда я их вытаскиваю, я храню их как keyvaluepair<int, string> элементов в классе, который их использует.

Когда мне нужно было составить список из них, я думал, что просто создам для них список <> вместо того, чтобы использовать два разных типа данных для получения одинаковых данных.

Моя проблема возникла, когда мне нужно заполнить выпадающий список в gridview, когда я использую бит edittemplate. Если я использую источник данных, чтобы вытащить это, он напишет [1 Главная] в тексте, а не поместит int как значение, а Home - как текст для отображения.

У меня есть вопрос с несколькими частями.

1:

Я являюсь глупым? Это действительно плохой способ получить данные и сохранить их (часть keyvaluepair)? Должен ли я просто хранить все это в виде данных? Мне не нравилось все это записывать в формате datatable. У меня есть DAL для моего BLL и пытались инкапсулировать все как объекты или объекты List<>, а не таблицы всего. В большинстве случаев это сработало хорошо.

Два:

Если бы я использовал какой-то предмет, а не DataTable связывать в моем ObjectDataSource для DropDownList, как я могу установить выбранное значение, а не у него просто есть первый элемент в списке выбран?

EDIT

Как было указано ниже я был идиотом и просто необходимо установить DataValueField и DataKeyField.

Чтобы получить DropDownList связать я просто должен был сделать:

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

причина, почему я не видел, что один сразу потому, что он не появляется в моем IntelliSense, но когда я вручную ввели его в, это сработало.

ответ

29

Используйте словарь < INT, строка > и установить DropDown DataValueField в Key и DataTextField к стоимости.

// 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 - Я думал, что у меня был * легко * 30 очков или около того, но вы бьете меня к нему. Хорошая работа и хороший ответ! –

+1

Благодарю вас .. это связало это блестяще .. он работал со списком <> из них. Но я думаю, в некоторых отношениях, что словарь в любом случае ... – Jon

+0

Я забыл установить DataValueField и DataTextField .. Причинение моего значения и отображения Текст выпадающего списка тот же. БЛАГОДАРЯ! –

0

и его мой пользовательский метод

// 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> 
Смежные вопросы