Как реализовать Generics в определении класса бизнес-объекта с помощью DAL для создания правильного выпадающего пользовательского элемента управления - PullRequest
2 голосов
/ 05 ноября 2011

Я очень плохо знаком с дженериками, будучи привязанным к поддержке корпоративного веб-приложения для интрасети, процесс обновления которого связан с бюрократизмом и медленно меняющимися стандартами.Следовательно, сегодня (к счастью!) Я наконец-то карабкаюсь во время нашего обновления до .Net 3.5 и перевожу весь код, который я могу, в правильно многоуровневую модель.

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

Здесь есть совершенно лаконичный вопрос, который подробно описывает, что именно меня интересует в исследовании: Установитьвыбранный индекс в выпадающем списке в usercontrol .

Однако мне бы очень хотелось увидеть, как выглядит Travel_CarSizes.GetCarSizes() внутри и как определяется класс Travel_CarSizes.(Мне трудно с <T> и я знаю, где это должно произойти.)

Для моих конкретных обстоятельств на данный момент мне нужен выпадающий пользовательский элемент управления, чтобы содержать указания направления (N, S, W,C / O, NW, SE и т. Д.), Которые хранятся в таблице SQL в БД и чей выбранный индекс должен быть в состоянии быть установленным на какой бы странице он ни находился, когда существуют данные формы.

Я начал реализовывать модель в примере по ссылке выше, но сейчас без использования Generics , потому что не могу понять:

Выпадающий пользовательский элемент управления:

public partial class DropDownStreetPrefix : System.Web.UI.UserControl
{
    public string StreetPrefixValue
    {
        get { return ddlStreetPrefix.SelectedValue.ToString(); }
        set
        {
            Bind();
            ddlStreetPrefix.SelectedIndex = ddlStreetPrefix.Items.IndexOf(ddlStreetPrefix.Items.FindByValue(value));
        }
    }


    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            Bind();             
        }

    }

    private void Bind()
    {
        if (ddlStreetPrefix.Items.Count == 0)
        {
            SqlDataReader rdr = StreetDirectionals.GetDirectionals();
            ddlStreetPrefix.DataSource = rdr;
            ddlStreetPrefix.DataBind();

            ddlStreetPrefix.DataValueField = "StreetSuffixPrefixAbbr";
            ddlStreetPrefix.DataTextField = "StreetSuffixPrefixAbbr";

            ListItem li = new ListItem("", "");
            ddlStreetPrefix.Items.Insert(0, li);
            ddlStreetPrefix.SelectedIndex = 0;
        }
    }
}

Класс StreetDirectionals:

public class StreetDirectionals
{
    private StreetDirectionals () { }

    public static SqlDataReader GetDirectionals ()
    {
        string sqlText = "SELECT StreetSuffixPrefixAbbr FROM common..tblStreetSuffixPrefix " +
            "ORDER BY StreetSuffixPrefixAbbr";

        SqlDataReader rdr = SqlClient.ExecuteFetchReturnDataReader( theConnectionString, CommandType.Text, sqlText);

        return rdr;
    }

}

Я выделю взаимодействие с базой данных внутри класса StreetDirectionals, как только смогу выяснить, как изменить его код, если я будупреобразовать метод Bind () из моего выпадающего пользовательского элемента управления в следующее:

private void Bind()
{
    if (!IsPostBack)
    {
        **List<StreetDirectionals> sd = StreetDirectionals.GetDirectionals();**
        ddlStreetPrefix.DataSource = sd;
        ddlStreetPrefix.DataTextField = "StreetSuffixPrefixAbbr";
        ddlStreetPrefix.DataValueField = "StreetSuffixPrefixAbbr";
        ddlStreetPrefix.DataBind();
    }
}

Любая помощь будет очень цениться!

1 Ответ

2 голосов
/ 11 ноября 2011
public class StreetDirectional
{
    public string StreetSuffixPrefixAbbr { get; set; }

    public static IEnumerable<StreetDirectional> GetDirectionals ()
    {
        string sqlText = "SELECT StreetSuffixPrefixAbbr FROM common..tblStreetSuffixPrefix " 
            + "ORDER BY StreetSuffixPrefixAbbr";

        SqlDataReader rdr = SqlClient.ExecuteFetchReturnDataReader( theConnectionString, CommandType.Text, sqlText);

        var list = new List<StreetDirectional>();

        while (rdr.Read())
        {
            var item = new StreetDirectional() { StreetSuffixPrefixAbbr = (string)rdr["StreetSuffixPrefixAbbr"] };
            list.Add(item);
        }

        return list;
    }

}

тогда вы можете сделать это

ddlStreetPrefix.DataSource = StreetDirectional.GetDirectionals();
...