根据 3 层应用程序中的下拉列表填充文本框
Posted
技术标签:
【中文标题】根据 3 层应用程序中的下拉列表填充文本框【英文标题】:Populate Text boxes based on drop down list in 3 tier application 【发布时间】:2015-06-08 09:44:28 【问题描述】:我想根据下拉列表中的选择使用值填充我的文本框。
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'
【问题讨论】:
你传递的是一个字符串,而不是一个集合对象..? 从表单中我传入一个字符串值 请贴出班级DAL.collection
的结构。这样我们就可以帮助您将string
类型转换为DAL.collection
类型。
***.com/questions/14105265/dropdownlist-datasource/…
【参考方案1】:
是的,您尝试从表单将字符串值传递给业务层方法 returnTicket(collection b)。但在此业务层方法中,returnTicket(collection b) 签名具有要接受的集合类型参数。 从下拉列表中选择值后,所选值将存储在字符串变量中。 请将 BLL 和 DAL 的方法的集合类型更改为字符串类型。 此更改将解决上述错误。
【讨论】:
虽然这确实有效,但它会破坏已经调用GetTicket(collection b)
或 returnTicket(collection b)
的其他代码。【参考方案2】:
您需要将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;
【讨论】:
虽然这确实有效,但它会破坏已经调用GetTicket(collection b)
或 returnTicket(collection b)
的其他代码。【参考方案3】:
简答
在您的表示层中,将string
类型映射到DAL.collection
类型。 You can see this here.
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);
说明
这两个错误都是编译错误。你可以看到recreation of them both in this fiddle。
错误 1
“BLL.business.returnTicket(DAL.collection)”的最佳重载方法匹配有一些无效参数
编译器正试图找到一个名为BLL.business.returnTicket
的方法,它接受一个参数。在它找到的匹配中,该方法采用单个 DAL.collection
参数。相反,您传递给它的是 string
,这是一个无效的参数,因为 string
不是 DAL.collection
。 From MSDN:
重载解析是一种编译时机制,用于在给定参数列表和一组候选函数成员的情况下选择要调用的最佳函数成员。
错误 2
参数 1:无法从 'string' 转换为 'DAL.collection'
由于BLL.business.returnTicket
采用DAL.collection
参数,编译器会尝试将string
转换为DAL.collection
。它失败了,因为没有从string
类型到DAL.collection
类型的隐式转换。 From MSDN:
隐式转换:不需要特殊语法,因为转换是类型安全的,不会丢失任何数据。
怎么办?
您可以采用几种方法,按复杂程度排列。
在表示层中,将string
类型映射到DAL.collection
类型。推荐。
在您的业务层中,创建一个新的returnTicket(string)
方法重载,除了现有的,它将string
映射到DAL.collection
类。推荐。
同时更改 returnTicket(DAL.collection)
和 GetTicket(DAL.collection)
以采用 string
而不是 DAL.collection
。这有两个缺点:它会破坏当前使用 DAL.collection
参数调用这些方法的其他代码,并且需要在两种不同的方法中更改四行代码。
从string
创建一个user-defined conversion 到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);
【讨论】:
【参考方案4】:您正在从表示层传递一个字符串。尝试在表示层传递collection
。
【讨论】:
以上是关于根据 3 层应用程序中的下拉列表填充文本框的主要内容,如果未能解决你的问题,请参考以下文章