gridview связывает выпадающий список с List <keyvaluePair <int, string >> - PullRequest
7 голосов
/ 31 января 2009

В моей БД есть несколько таблиц, которые содержат ссылки на пару ключ-значение:

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

  • 1 - Дом
  • 2 - Работа
  • 3 - мобильный
  • 4 - Факс

и т.д.

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

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

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

Полагаю, у меня вопрос из нескольких частей.

One:

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

Два:

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

EDIT

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

Чтобы привязать выпадающий список, мне просто нужно было сделать:

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

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

Ответы [ 2 ]

32 голосов
/ 31 января 2009

Используйте словарь и установите свой 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 голосов
/ 10 ноября 2013

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

// 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>
...