2

我试图弄清楚如何访问和存储下拉列表中的选择以在 mainSQL 类的 SELECT 命令中使用。

这是细节。

DropDownList(在名为 Page.aspx 的页面上):

    <asp:DropDownList 
    ID="selectInfo1" 
    runat="server" 
    AutoPostBack="True"
    DataTextField="Info1"
    DataValueField="Info1Key"
    DataSourceID="SqlDB" >
    </asp:DropDownList>

我试图访问 DDL 的函数(在单独的类文件中):

public List<ListInfo> getList()
{
List<ListInfo> sList = new List<ListInfo>();
ListInfo objList = null;
    //This is where I need to declare a variable called Info1Key and set it to the value of the ddl!
string queryString = "SELECT [UniqueID], [Date], [Info1], [Info2], [Info3] FROM [ReportedSales] WHERE ([Info1] = ' " + Info1Key + "') ORDER BY [Date]";
using (SqlConnection connection = new SqlConnection(sqlConString))
{
    using (SqlCommand command = new SqlCommand(queryString, connection))
    {
        command.Connection.Open();
        using (SqlDataReader dataReader = command.ExecuteReader())
        {
            while (dataReader.Read())
            {
                objList = new ListInfo();
                objList.ID = Convert.ToInt16(dataReader["UniqueID"]);
                objList.Date = Convert.ToDateTime(dataReader["Date"]);
                objList.Info1 = (dataReader["Info1"] as int?) ?? 0;
                objList.Info2 = (dataReader["Info2"] as int?) ?? 0;
                objList.Info3 = (dataReader["Info3"] as int?) ?? 0;
                sList.Add(objList);
            }
        }
    }
}
return sList;
}

这是唯一调用 getList 方法的函数(我很确定)——

    private void FillListActivity()
    {
        List<ListInfo> objList = new List<ListInfo>();
        objList = new mainSQL().getList();

        ReportingGV.DataSource = objList;
        ReportingGV.DataBind();
    }

新问题——当我改变 DDL 时,GV 不再改变。

我可以解决的一种方法是更改​​ Page.aspx.cs 中的 Page_Load,如下所示:

起初:

 protected void Page_Load(object sender, EventArgs e)
{
    if(!isPostBack)
    {
        FillSalesActivity();
    }
}

工作,但我会有问题吗?:

    protected void Page_Load(object sender, EventArgs e)
    {
        FillSalesActivity();
    }
4

1 回答 1

4

您不希望您的外部类知道或关心 UI 元素(例如下拉列表)的任何内容。它们应该尽可能与 UI 无关。

相反,在这种情况下您想要做的是将值传递给函数。因此,您可以将函数签名更改为如下所示:

public List<ListInfo> getList(string Info1Key)
{
    // The code is the same, just use the Info1Key parameter that's been passed to the function.
}

然后你会这样调用函数:

private void FillSalesActivity()
{
    List<SalesInfo> objSalesList = new List<SalesInfo>();
    objSalesList = new mainSQL().getSalesList(selectInfo1.SelectedValue);

    SalesReportingGV.DataSource = objSalesList;
    SalesReportingGV.DataBind();
}

需要注意的几点:

  • 您需要在页面上包含错误检查,以确保在SelectedValue调用该函数之前有一个值。
  • 真的应该调查一下 SQL 注入漏洞,因为你的代码有一个。 永远不要隐含地相信来自客户端的值,即使它来自下拉列表并且您认为您可以控制这些值。你没有。如果客户愿意,他们可以发送他们想要的任何值,并且该值可以包含 SQL 代码,您的函数会以所需的所有权限对您的数据库愉快地运行这些代码。研究使用“参数化查询”,或者更好的是 ORM 框架。像 Linq To Sql 这样的东西有一个非常快速的设置和低学习曲线,并为您提供了很多功能。
于 2013-01-08T21:46:56.147 回答