嘘~ 正在从服务器偷取页面 . . .

ASP.NET GridView 根据数据动态生成BoundField


公司系统是一个缝缝补补又一年

随着业务量与数据量增加而越来越拉的远古ASP.NET系统

许许多多特性都被公司自己的组件和WebForm本身的组件限制得死死的

再结合甲方各种奇葩要求,有些数据甚至只能够通过建立临时表的形式再分别插入

有些sql代码久远且缺乏维护,甚至大量使用SQL进行计算,联合查询量巨大,系统速度也很慢,

数据表结构缺乏规范,查询某项数据需要大量联合查询,无数据字典,同事命名过于放飞自我,甲方需要的数据动不动就需要联合查询很大一部分表,且手写SQL语句,每天都在怀疑人生(河里摸鱼)

以下是死亡代码展示(大雾):

同事的死亡SQL(部分)

万物皆可Business(啥都叫这名字找东西可有被累到)

BoundField 本身是ASP.NET GridView 表格控件的一部分。

通过绑定数据源生成数据,控件的初衷自然而然是为了简化操作。

由于对ASP远古控件不熟悉且。。

本着不影响老板赚钱缝缝补补继续使用的原则(x)

可能只能用一些蠢蠢的办法(也有可能是因为自己蠢蠢吧 不过ASP放到今天真的是yue)

公司的表格依赖于自定义控件,基于GridView,通过接收后台返回DataTable呈现数据。

而甲方想要根据某分类来动态生成表格,受限于只能使用公司控件

又想着反正量不大(应该)能用就行(x)

结合官方文档

发现可以在后台新建BoundField对象并通过属性对应赋值,从而达到ASP.NET动态生成表格的目的。


嗯。。。

直接SELECT:

public int QueryMsfsAreaDivi_Gj_ColCounts()
{
    string excSql = "SELECT Count(DISTINCT dbo.f_GetTopParentTypeName(a.typeId,'')) as TopTypeNum " +
        "FROM Specifications AS a";
    return (int)DtQuery(excSql).Rows[0]["TopTypeNum"];
}

查询SQL通过高端不经过思考的循环加上对应列:

 int ColCounts = QueryMsfsAreaDivi_Gj_ColCounts();
        string ColCountsSql = "";
        for (int i = 0; i <ColCounts; i++)
        {
            if (i == ColCounts - 1)
            {
                ColCountsSql += "0 AS TypeName_" + i + "";
                break;
            }
            ColCountsSql += "0 AS TypeName_" + i + ",";
        }
..............
  sql = "SELECT DISTINCT ISNULL(Area.AreaName1,'')AS Region,a.DeviceArea,0 AS InGuaranteesDateNum,0 AS NotInGuaranteesDateNum,0 AS AllNum," +
            ""+ColCountsSql+" " +
..............

再使用在后台根据SELECT数量New BoundField,并设置对应的DataField(如果DataField与数据源(Datatable)不一致控件就会报错):

private void InitGrid(string order)
{
    for (int i = 0; i < ColCounts; i++)
    {
        ColCountsNames = "TypeName_" + i.ToString();
        BoundField DynamicGeCols = new BoundField
        {
            HeaderText = ColCountsNames,
            DataField = ColCountsNames,
            DataFormatString = "{0:0}",
            HtmlEncode = false,
            SortExpression = ColCountsNames
        };
        GvData.Columns.Add(DynamicGeCols);

    }
    PageNavigator1.Total = 1;
    PageNavigator1.SetCurPage(1);
    PageNavigator1.ForceQueryAll = true;
    PageNavigator1.Query = ServiceFactory.getServiceAccount().QueryMsfsAreaDivi_Gj(stDept.Value, ddlType.SelectedValue, ddlYear.SelectedValue, ddlMonth.SelectedValue, "", FormHelper.GetClientIPEx(), true).ToString();
}

效果如下:

效果图

嗯。。。每天都不知道自己在跟这帮沙雕SQL和同事沙雕代码较什么劲。。(已经穿越回十年前了)

至于列名的话。。马上就下班点了 摸鱼Time摸鱼Time!


文章作者: Seacolorfox
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Seacolorfox !
评论