Заполнить текстовые поля на основе раскрывающегося списка в 3-х уровневом приложении

Я хотел бы заполнить свои текстовые поля значениями, основанными на выборе из моего выпадающего списка.

DAL:

public static string GetTicket(collection b)
{
    try
    {

        string returnValue = string.Empty;
        DB = Connect();
        DBCommand = connection.Procedure("getTicket");
        DB.AddInParameter(DBCommand, "@SupportRef", DbType.String, b.SupportRef1);

        var myReader = DBCommand.ExecuteReader();
        while (myReader.Read())
        {
            returnValue = myReader.GetString(0);
        }

        return returnValue;
    }

    catch (Exception ex)
    {
        throw ex;
    }

BLL:

   public string returnTicket(collection b)
   {
       try
       {
           string ticket = DAL.data.GetTicket(b);
           return ticket;
       }
       catch (Exception ex)
       {
           throw ex;
       }
   }

PL:

protected void ddl_Customers_SelectedIndexChanged(object sender, EventArgs e)
{
    string selectedValue = ddl_Customers.SelectedValue.ToString();

    //populate the text boxes
    txtSupportRef.Text = bobj.returnTicket(selectedValue);
}

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

Я получаю следующие ошибки:

The best overloaded method match for 'BLL.business.returnTicket(DAL.collection)' 
has some invalid arguments

А ТАКЖЕ

Argument 1: cannot convert from 'string' to 'DAL.collection'

4 ответа

Решение

Короткий ответ

На вашем уровне представления отобразите string введите в DAL.collection тип. Вы можете увидеть это здесь.

protected void ddl_Customers_SelectedIndexChanged(object sender, EventArgs e)
{
    string selectedValue = ddl_Customers.SelectedValue.ToString();

    // map the string to a DAL.collection
    var collection = new DAL.collection();
    collection.SupportRef1 = selectedValue;

    //populate the text boxes
    txtSupportRef.Text = bobj.returnTicket(collection);
}

объяснение

Обе ошибки являются ошибками компиляции. Вы можете увидеть воссоздание их обоих в этой скрипке.

Ошибка 1

Наилучшее совпадение перегруженного метода для 'BLL.business.returnTicket(DAL.collection)' содержит недопустимые аргументы

Компилятор пытается найти метод с именем BLL.business.returnTicket это занимает один аргумент. В найденном совпадении метод принимает один DAL.collection аргумент. Вы передаете это string вместо этого, который является недопустимым аргументом, потому что string это не DAL.collection, Из MSDN:

Разрешение перегрузки - это механизм времени компиляции для выбора наилучшего члена функции для вызова с учетом списка аргументов и набора кандидатов в члены функции.

Ошибка 2

Аргумент 1: невозможно преобразовать из строки в DAL.collection

поскольку BLL.business.returnTicket занимает DAL.collection аргумент, компилятор пытается преобразовать string в DAL.collection, Это терпит неудачу, потому что нет неявного преобразования из string введите в DAL.collection тип. Из MSDN:

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

Что делать?

Есть несколько подходов, которые вы можете использовать, в порядке сложности.

  1. На вашем уровне представления отобразите string введите в DAL.collection тип. Рекомендуемые.

  2. На вашем бизнес-уровне создайте новый returnTicket(string) перегрузка метода, в дополнение к существующему, который отображает string к DAL.collection учебный класс. Рекомендуемые.

  3. Изменить оба returnTicket(DAL.collection) а также GetTicket(DAL.collection) взять string вместо DAL.collection, У этого есть два недостатка: он сломает другой код, который в настоящее время вызывает эти методы с DAL.collection аргумент, и это требует изменения четырех строк кода в двух разных методах.

  4. Создайте пользовательское преобразование из string в DAL.collection. Недостаток: это, вероятно, перебор.

Рекомендуемые вещи, чтобы сделать

В вашем слое презентации преобразуйте или отобразите string введите в DAL.collection тип. Вот что дает короткий ответ выше.

Кроме того, на вашем бизнес-уровне создайте новый returnTicket(string) перегрузка метода, в дополнение к существующему методу. Это будет выглядеть так

public string returnTicket(collection b)
{
     // map the string to a DAL.collection
     var collection = new DAL.collection();
     collection.SupportRef1 = selectedValue;

     // call the existing method that takes a DAL.collection
     returnTicket(b);
}

Да, из формы вы пытаетесь передать значение String в метод бизнес-уровня returnTicket(коллекция b). Но в этом методе бизнес-уровня подпись returnTicket(collection b) имеет аргумент типа коллекции, который должен быть принят. После выбора значения из выпадающего списка, выбранное значение сохраняется в строковой переменной. Измените тип коллекции метода BLL и DAL на строковый тип. Это изменение устранит вышеуказанную ошибку.

Вам нужно пройти string введите аргумент для returnTicket of BLL а также GetTicket of DAL. Измените ваши методы, как это

BLL

public string returnTicket(string supportRef)
{
   try
   {
       string ticket = DAL.data.GetTicket(supportRef);
       return ticket;
   }
   catch (Exception ex)
   {
       throw ex;
   }
}

DAL

public static string GetTicket(string supportRef)
{
 try
 {

    string returnValue = string.Empty;
    DB = Connect();
    DBCommand = connection.Procedure("getTicket");
    DB.AddInParameter(DBCommand, "@SupportRef", DbType.String, supportRef);

    var myReader = DBCommand.ExecuteReader();
    while (myReader.Read())
    {
        returnValue = myReader.GetString(0);
    }

    return returnValue;
 }


 catch (Exception ex)
 {
    throw ex;
 }

}

Вы передаете строку из слоя представления. Попробуйте передать collection на уровне представления.

Другие вопросы по тегам