需要通过类访问DropDownList的帮助

时间:2013-01-08 21:33:41

标签: c# asp.net visual-studio-2010

我正在尝试弄清楚如何从下拉列表中访问和存储选择,以便在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.opx.cs中的Page_Load,如下所示:

最初:

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

工作,但我有问题吗?:

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

1 个答案:

答案 0 :(得分: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这样的东西具有非常快速的设置和较低的学习曲线,并为您提供了很多功能。