Заполнить текстовые поля на основе раскрывающегося списка в 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:
Неявные преобразования: специальный синтаксис не требуется, поскольку преобразование является безопасным типом и данные не будут потеряны.
Что делать?
Есть несколько подходов, которые вы можете использовать, в порядке сложности.
На вашем уровне представления отобразите
string
введите вDAL.collection
тип. Рекомендуемые.На вашем бизнес-уровне создайте новый
returnTicket(string)
перегрузка метода, в дополнение к существующему, который отображаетstring
кDAL.collection
учебный класс. Рекомендуемые.Изменить оба
returnTicket(DAL.collection)
а такжеGetTicket(DAL.collection)
взятьstring
вместоDAL.collection
, У этого есть два недостатка: он сломает другой код, который в настоящее время вызывает эти методы сDAL.collection
аргумент, и это требует изменения четырех строк кода в двух разных методах.Создайте пользовательское преобразование из
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
на уровне представления.