如何将方法中创建的数组传递给该方法之外的下拉列表?

时间:2013-08-13 19:21:13

标签: c# asp.net

我需要一些帮助“微调”我程序中的一段代码,它填充一个数组并将该数组绑定到一个下拉列表。这是代码:

using ([SQL Data Connection])
{
    var stakes = from st in ddl.STK_Stakes
                 where st.STK_EVT_FK == eventId
                 select new
                 {
                     st.STK_Description
                 };

    string[] stakeDesc = new string[stakes.Count()];

    foreach (var stake in stakes)
    {
        stakeDesc[stakeCount] = stake.STK_Description;
        stakeCount++;
    }

    foundDDL.DataSource = stakeDesc;
    foundDDL.DataBind();

当findDDL在屏幕上时,此代码使用选项填充下拉列表“foundDDL”。 此代码可以 ,但正如当前使用的那样,每次在屏幕上创建一个foundDDL实例时它都会执行。

由于在findDDL中填充的选项总是在该页面上是相同的,我想将此代码移动到自己的方法,然后我可以在加载时运行一次,填充我的数组,然后根据需要将预先填充的数组提供给foundDDL。这将减少对我的数据库的调用次数,并使我的程序更有效。

我遇到的问题是我无法弄清楚如何在方法之外实例化我的数组,因为我在数组中需要的空格数可能会发生变化。

3 个答案:

答案 0 :(得分:0)

尝试使用静态属性?

private static string[] stakeDesc;
public static string[] StakeDesc {
    get {
        if(stakeDesc == null)
            //initialize it

        return stakeDesc;
    }
}

答案 1 :(得分:0)

您无需指定声明它的大小,只需将其声明在方法之外并按原样进行实例化,如果已经实例化,则只需返回它。

//In global scope somewhere
string[] stakeDesc;

if (stakeDesc==null || OtherReasonToRefreshData())
{
    using ([SQL Data Connection])
    {
        var stakes = from st in ddl.STK_Stakes
                     where st.STK_EVT_FK == eventId
                     select new
                     {
                         st.STK_Description
                     };

        stakeDesc = new string[stakes.Count()];

        foreach (var stake in stakes)
        {
            stakeDesc[stakeCount] = stake.STK_Description;
            stakeCount++;
        }
    }
}
foundDDL.DataSource = stakeDesc;
foundDDL.DataBind();

请注意,您可以使用10个元素实例化数组,而不是将其重新分配给包含50个元素的新数组。

答案 2 :(得分:0)

由于信息没有改变,您应该缓存此信息而不是命中数据库。

代码应该大概(没有编译):

class MyCodeBehindClass
{
    private List<string> _StakeDesc;//use a dynamically sized array
    private List<string> StakeDesc
    {
        get
        {
            if (Session[StakeDescKey] != null)
                _StakeDesc = (List<string>)Session[StakeDescKey];
            else
            {
                _StakeDesc = GetStakeDesc();
            }
            return _StakeDesc;
        }
        set { _StakeDesc = value; }
    }

    private List<string> GetStakeDesc()
    {
        using ([SQL Data Connection])
        {
            var stakes = from st in ddl.STK_Stakes
                         where st.STK_EVT_FK == eventId
                         select new
                             {
                                 st.STK_Description
                             };

            Session[StakeDescKey] = stakes.ToList();//Populate cache
        }
    }

    private void PageLoad()
    {
        //if not postback...
        foundDDL.DataSource = StakeDesc;//Smart property that checks cache
        foundDDL.DataBind();
    }
}