将虚拟列添加到强类型数据集

时间:2008-10-07 18:15:31

标签: c# ado.net dataset strongly-typed-dataset

我正在编写一个使用强类型数据集的网站。

创建表的DBA为列提供了一个表示负数的值。该列是'Do_Not_Estimate_Flag',其中列可以包含'T'或'F'。我无法更改基础表或填充它的逻辑。我想要做的是在我的强类型DataSet的DataRow中添加一个'ESTIMATION_ALLOWED'列。我使用我可以修改的分部类完成了这个。 (我可以安全地修改自动生成的partial类和非自动生成的partial类。)逻辑位于partial类的属性中。麻烦的是当值加载ala

<%#DataBinder.Eval(Container.DataItem, "ESTIMATION_ALLOWED")%>

它直接到底层的DataRow忽略我的属性。我怎样才能最好地达到预期效果?

这是我的代码:

部分类MyFunkyDataTable         {

        private System.Data.DataColumn columnESTIMATION_ALLOWED;
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public System.Data.DataColumn ESTIMATION_ALLOWEDColumn
        {
            get
            {
                return columnESTIMATION_ALLOWED;
            }
        }

        public override void EndInit()
        {


            //init class
            columnESTIMATION_ALLOWED = new System.Data.DataColumn("ESTIMATION_ALLOWED", typeof(string), null, global::System.Data.MappingType.Element);
            Columns.Add(columnESTIMATION_ALLOWED);
            columnESTIMATION_ALLOWED.ReadOnly = true;

            //init Vars
            columnESTIMATION_ALLOWED = Columns["ESTIMATION_ALLOWED"];
            base.EndInit();
        }




    }
    partial class MyFunkyRow 
    {
        public string ESTIMATION_ALLOWED
        {
            get
            {
                if(DO_NOT_EST_FLAG == "N")
                {
                    return "Yes";
                }
                return "No";
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

DataBinder将看到您绑定到DataRow并使用其字段而不是您定义的任何属性。

您可以创建一种方法来执行您想要的操作,例如:

<%#FormatFlag(DataBinder.Eval(Container.DataItem, "Do_Not_Estimate_Flag" ))%>

你有一个方法:

protected string FormatFlag(object doNotEstimateFlag)
{
    if (doNotEstimateFlag.ToString() == "N") return "Yes";
    return "No";
} 

另一种方法是修改填充DataTable的查询。例如,您可以在类型化数据集中使用“ESTIMATE_ALLOWED”列。填充它的查询看起来类似于以下内容(依赖于数据库,这适用于SQL Server):

SELECT
   ...
   CASE WHEN Do_Not_Estimate_Flag = 'N' THEN 'Yes' ELSE 'No' END ESTIMATE_ALLOWED,
   ...
FROM
   ...

答案 1 :(得分:0)

如果我记得,ST数据集数据行是在部分类中实现的。因此,您可以在主ST数据集行类的部分类中添加所需的功能。