Какой самый удобный тип данных я могу использовать для заполнения DropDownList? - PullRequest
0 голосов
/ 21 августа 2010

Например, я хочу, чтобы пользователь создал новый фан-клуб для данной команды.

Очевидно, что команды должны быть загружены в DropDownList, поэтому они выбираются из предварительно заданной группы выбора. Список команд возвращается из базы данных.

На данный момент я делаю такие вещи:

//FindAll() returns IQueryable<Team>
var Teams = teamsRepo.FindAll().AsEnumarable();
myDropDownList.DataTextField = "Name";
myDropDownList.DataValueField = "ID";
myDropDownList.DataSource = Teams;
myDropDownList.DataBind();

К сожалению, когда я так поступаю, у меня нет строго типизированных атрибутов, поэтому существует риск неправильного написания ValueField или TextField.

Существует также проблема при попытке получить выбранное значение DropDownList. Используя следующий код, все сохраняется с ID 1 независимо от того, какая команда была выбрана.

fansite.IDTeam = myDropDownList.SelectedIndex;

Есть предложения по улучшению?

Ответы [ 4 ]

2 голосов
/ 21 августа 2010

Судя по вашему вопросу, вы обеспокоены жестко закодированными строками для привязки данных в вашем коде.То же самое обычно приводило меня в бешенство.

Существует хороший способ использования лямбда-методов и деревьев выражений, который позволит вам избавиться от жестко закодированных строк и получить имена свойств строго типизированным способом.:

Вы можете использовать этот класс и метод расширения ...

public class Nameof<T>
{
    public static string Property<TProp>(Expression<Func<T, TProp>> expression)
    {
        var body = expression.Body as MemberExpression;
        if(body == null)
            throw new ArgumentException("'expression' should be a member expression");
        return body.Member.Name;
    }
}

... и это позволит вам сделать следующее:

//instead of myDropDownList.DataTextField = "Name";
myDropDownList.DataTextField = Nameof<Team>.Property(t => t.Name);
//instead of myDropDownList.DataValueField = "ID";
myDropDownList.DataValueField = Nameof<Team>.Property(t => t.ID);

Эточто мне нравится видеть;не жёстко закодированный строковый литерал в поле зрения!: -)

1 голос
/ 21 августа 2010

Именно так работает привязка данных .NET, вы должны ввести имена свойств.

Вы всегда можете добавить конвертер к элементу комбинированного списка, а затем вызвать add ( ms-doc )

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

fansite.IDTeam = myDropDownList.SelectedValue;
1 голос
/ 21 августа 2010

(Это было написано до прояснения ASP.Net, я ответил с точки зрения winforms).

Я не уверен, на что похожи ваши Teams идентификаторы, но если они не являются последовательными, основаны на нулях и не имеют пробелов, использование myDropDownList.SelectedIndex; даст вам неправильный фрагмент данных.

Я думаю, что последняя строка должна читать:

fansite.IDTeam = myDropDownList.SelectedValue;

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

0 голосов
/ 21 августа 2010

Вам следует рассмотреть возможность использования источников данных, таких как ObjectDataSource или LinqDataSource, для привязки данных к своим элементам управления.

Это сэкономит ваше время и будет менее подвержено ошибкам, поскольку вы будете настраивать свои параметры с помощью мастера, а не определять их в своем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...