根据 3 层应用程序中的下拉列表填充文本框

Populate Text boxes based on drop down list in 3 tier application

我想根据下拉列表中的选择用值填充我的文本框。

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 的变量,它需要一个值才能 return 结果。

我收到以下错误:

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

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

是的,您正试图从表单中将字符串值传递给业务层方法 returnTicket(collection b)。但是在此业务层方法 returnTicket(collection b) 签名中具有要接受的集合类型参数。 从下拉列表中选择值后,所选值将存储在字符串变量中。 请将BLL和DAL的方法的集合类型改为字符串类型。 此更改将解决上述错误。

您需要将 string 类型参数传递给 returnTicket of BLLGetTicket 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

简答

在您的表示层中,将 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

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

编译器正试图找到一个名为 BLL.business.returnTicket 的方法,该方法采用单个参数。在找到的匹配项中,该方法采用单个 DAL.collection 参数。您传递给它的是 string,这是一个无效参数,因为 string 不是 DAL.collectionFrom MSDN:

Overload resolution is a compile-time mechanism for selecting the best function member to invoke given an argument list and a set of candidate function members.

错误 2

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

由于 BLL.business.returnTicket 采用 DAL.collection 参数,编译器会尝试将 string 转换为 DAL.collection。它失败是因为没有从 string 类型到 DAL.collection 类型的 隐式转换 From MSDN:

Implicit conversions: No special syntax is required because the conversion is type safe and no data will be lost.

怎么办?

您可以采用几种方法,按复杂程度排序。

  1. 在您的表示层中,将 string 类型映射到 DAL.collection 类型。推荐。

  2. 在您的业务层中,除了现有方法重载之外,创建一个新的 returnTicket(string) 方法重载,它将 string 映射到 DAL.collection class。推荐。

  3. returnTicket(DAL.collection)GetTicket(DAL.collection) 都更改为 string 而不是 DAL.collection。这有两个缺点:它会破坏当前使用 DAL.collection 参数调用这些方法的其他代码,并且它需要在两种不同的方法中更改四行代码。

  4. 创建一个从 stringDAL.collection.user-defined conversion 缺点:这可能有点矫枉过正。

推荐的活动

在您的表示层中,将 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);
}