【问题标题】:Can I make a column's value late databound?我可以使列的值延迟数据绑定吗?
【发布时间】:2013-07-05 10:24:48
【问题描述】:

我有一个包含几列的表,我想添加一个列而不首先为其提供值,因为它是一个(有些)复杂的对象,每次使用该表时可能都没有用。

所以我当前的代码如下所示:

            var com = new SqlConnection(functions.ConnectionString).CreateCommand();
            com.CommandText = @"
SELECT
    S.id
    , S.Name
    , S.MemberID
FROM dbo.SubSets AS S
WHERE S.SubsetType = 0
AND S.MemberId > 1
";
            this.tblSubsets = new DataTable();

            new SqlDataAdapter(com).Fill(this.tblSubsets);

            this.tblSubsets.Columns.Add(new DataColumn()
            {
                AllowDBNull = true
                , ColumnName = "Member"
                , DataType = typeof(object) // ?
                , DefaultValue = DBNull.Value // late binding mechanism?
            });

我怎样才能使该列Member 保持“空”,直到它被使用DoSomethingwith(table.Rows[x]["Member"])

【问题讨论】:

    标签: c# datatable late-binding


    【解决方案1】:

    我猜你不能。

    我最终存储了一个Func<T>,并在向表中添加一行时自动设置该字段。
    加上闭包中的字典服务于性能目标。

                this.tblSubsets = new DataTable();
    
                this.tblSubsets.Columns.AddRange(new DataColumn[] {
                    new DataColumn()
                    {
                        AllowDBNull = false
                        , ColumnName = "Member"
                        , DataType = typeof(Func<Member>)
                    }
                });
    
                var members = new Dictionary<int, Member>();
                this.tblSubsets.RowChanged += new DataRowChangeEventHandler((object sender, DataRowChangeEventArgs e) =>
                {
                    if (e.Action != DataRowAction.Add)
                    {
                        return;
                    }
    
                    e.Row["Member"] = new Func<Member>(() =>
                    {
                        Member returnValue;
                        var mid = Convert.ToInt32(e.Row["MemberID"]);
    
                        if (!members.TryGetValue(mid, out returnValue))
                        {
                            members.Add(mid, (returnValue = new Member(mid)));
                        }
    
                        return returnValue;
                    });
                });
    
    
                var com = new SqlConnection(functions.ConnectionString).CreateCommand();
                com.CommandText = @"
    SELECT
        S.id
        , S.Name
        , S.MemberID
    FROM dbo.SubSets AS S
    WHERE S.SubsetType = 0
    ";
                new SqlDataAdapter(com).Fill(this.tblSubsets);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多