0

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

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();

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

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

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

4

3 回答 3

0

尝试使用静态属性?

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

        return stakeDesc;
    }
}
于 2013-08-13T19:29:06.840 回答
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 个元素的新数组而不会出现问题。

于 2013-08-13T19:30:00.167 回答
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();
    }
}
于 2013-08-13T19:39:25.867 回答