我需要一些帮助“微调”我程序中的一段代码,它填充一个数组并将该数组绑定到一个下拉列表。这是代码:
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。这将减少对我的数据库的调用次数,并使我的程序更有效。
我遇到的问题是我无法弄清楚如何在方法之外实例化我的数组,因为我在数组中需要的空格数可能会发生变化。
答案 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();
}
}