早上有分享《Repeater控件動態(tài)變更列(Header,Item和Foot)信息》 ,是動態(tài)變更一些列的內容。
雖然它算不上是完全動態(tài)化,但它已經(jīng)達到初期想要的效果。如果你稍有仔細,也能輕易把它弄出來?,F(xiàn)另開一篇,Insus.NET不是重新另外寫,而是想重構cs的代碼,因為前一篇的代碼雖然簡單,但代碼冗余過多。
重構開始:
首先把這五個變量刪除,因為在重構過程中,已經(jīng)不需要這五個變量了。
復制代碼 代碼如下:
//宣告5個變量,將用來存儲那5個月份每個部分的數(shù)量
decimal c1, c2, c3, c4, c5;
接下來需要改動的是宣告一個常量,很多地方使用到它:
復制代碼 代碼如下:
const int dynamicColumns = 5;
把程序中的下面這句
復制代碼 代碼如下:
objPrintLog.Months = 5; //最近連續(xù)5個月份
改為:
復制代碼 代碼如下:
objPrintLog.Months = dynamicColumns;
也就是說,使用常量的變量去替代舊代碼的"5"。
接下來,我們重構Repwater控件的Header的代碼,為了好對比,Insus.NET把上一篇對應的圖片引用在這里:
重構如下:
復制代碼 代碼如下:
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 部分:
舊代碼重構之后的代碼,第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的重構:
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();
}
}
}
}
重構是在程序功能要求不變的情況之下,減少冗余的代碼。
您可能感興趣的文章:- Repeater事件OnItemCommand取得行內控件的方法
- Repeater控件與PagedDataSource結合實現(xiàn)分頁功能
- Repeater控件實現(xiàn)編輯、更新、刪除等操作示例代碼
- Repeater怎么實現(xiàn)多行間隔顯示分隔符
- Repeater中嵌套Repeater的示例介紹
- repeater做刪除前彈窗詢問實例
- 給Repeater控件里添加序號的5種才常見方法介紹
- asp.net Repeater 數(shù)據(jù)綁定的具體實現(xiàn)(圖文詳解)
- .net JS模擬Repeater控件的實現(xiàn)代碼
- Repeater控件綁定的三種方式
- 利用js的Node遍歷找到repeater的一個字段實例介紹
- ASP.NET筆記之 Repeater的使用
- Repeater綁定dictionary數(shù)據(jù)源代碼及報錯解決
- asp.net Repeater分頁實例(PageDataSource的使用)
- asp.net中使用repeater和PageDataSource搭配實現(xiàn)分頁代碼
- Repeater里switch的使用方法
- Repeater的FooterTemplate顯示某列總計思路與代碼
- 嵌套repeater示例分享