欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Repeater控件动态变更列(Header,Item和Foot)信息(重构cs)

程序员文章站 2024-03-02 18:18:16
早上有分享《repeater控件动态变更列(header,item和foot)信息》 ,是动态变更一些列的内容。 虽然它算不上是完全动态化,但它已经达到初期想要的效果。如...

早上有分享《repeater控件动态变更列(header,item和foot)信息》 ,是动态变更一些列的内容。

虽然它算不上是完全动态化,但它已经达到初期想要的效果。如果你稍有仔细,也能轻易把它弄出来。现另开一篇,insus.net不是重新另外写,而是想重构cs的代码,因为前一篇的代码虽然简单,但代码冗余过多。

重构开始:
首先把这五个变量删除,因为在重构过程中,已经不需要这五个变量了。

复制代码 代码如下:

//宣告5个变量,将用来存储那5个月份每个部分的数量
decimal c1, c2, c3, c4, c5;

接下来需要改动的是宣告一个常量,很多地方使用到它:
复制代码 代码如下:

const int dynamiccolumns = 5;

把程序中的下面这句
复制代码 代码如下:

objprintlog.months = 5; //最近连续5个月份

改为:
复制代码 代码如下:

objprintlog.months = dynamiccolumns;

也就是说,使用常量的变量去替代旧代码的"5"。

接下来,我们重构repwater控件的header的代码,为了好对比,insus.net把上一篇对应的图片引用在这里:
Repeater控件动态变更列(Header,Item和Foot)信息(重构cs)

 Repeater控件动态变更列(Header,Item和Foot)信息(重构cs)

重构如下:

复制代码 代码如下:

protected void repeaterlfms_itemdatabound(object sender, repeateritemeventargs e)
{
if (e.item.itemtype == listitemtype.header)
{
if (e.item.findcontrol("labelh0") != null
&& e.item.findcontrol("labelh1") != null
&& e.item.findcontrol("labelh2") != null
&& e.item.findcontrol("labelh3") != null
&& e.item.findcontrol("labelh4") != null
&& e.item.findcontrol("labelh5") != null)
{
for (int i = 0; i <= dynamiccolumns; i++)
{
label lh = (label)e.item.findcontrol("labelh" + i.tostring());
lh.text = objdt.columns[i].columnname;
}
}
}

只要一对比,就可以明了看到变代码中的代码。下面是repwater控件item 部分:
Repeater控件动态变更列(Header,Item和Foot)信息(重构cs)

旧代码重构之后的代码,第16行代码,是判断第一列,因为它是字符串,因此单独排除。第23行,使用viewstate来替代旧程序的5个变量。

复制代码 代码如下:

if (e.item.itemtype == listitemtype.alternatingitem || e.item.itemtype == listitemtype.item)
{
datarowview drv = (datarowview)e.item.dataitem;
if (e.item.findcontrol("labeli0") != null
&& e.item.findcontrol("labeli1") != null
&& e.item.findcontrol("labeli2") != null
&& e.item.findcontrol("labeli3") != null
&& e.item.findcontrol("labeli4") != null
&& e.item.findcontrol("labeli5") != null)
{

for (int j = 0; j <= dynamiccolumns; j++)
{
label li = (label)e.item.findcontrol("labeli" + j.tostring());

if (j == 0)
li.text = drv[objdt.columns[0].columnname].tostring();
else
{
decimal v = string.isnullorempty(drv[objdt.columns[j].columnname].tostring()) ? 0 : convert.todecimal(drv[objdt.columns[j].columnname].tostring());
li.text = v.tostring();

viewstate["c" + j.tostring()] = viewstate["c" + j.tostring()] == null ? 0 : convert.todecimal(viewstate["c" + j.tostring()]) + v;
}
}
}
}

最后是foot的重构:
Repeater控件动态变更列(Header,Item和Foot)信息(重构cs)

foot重构好的代码,第14行是判断是否为第一列,第17行,是把viewstate的值赋给label。

复制代码 代码如下:

if (e.item.itemtype == listitemtype.footer)
{
if (e.item.findcontrol("labelf0") != null
&& e.item.findcontrol("labelf1") != null
&& e.item.findcontrol("labelf2") != null
&& e.item.findcontrol("labelf3") != null
&& e.item.findcontrol("labelf4") != null
&& e.item.findcontrol("labelf5") != null)
{
for (int k = 0; k <= dynamiccolumns; k++)
{
label lf = (label)e.item.findcontrol("labelf" + k.tostring());

if (k == 0)
lf.text = "total";
else
lf.text = viewstate["c" + k.tostring()] == null ? "0" : viewstate["c" + k.tostring()].tostring();
}
}
}
}

重构是在程序功能要求不变的情况之下,减少冗余的代码。