我可以做一个专栏吗';s值延迟数据绑定

本文关键字:数据绑定 延迟 一个 我可以 | 更新日期: 2023-09-27 18:21:13

我有一个有几列的表,我想先添加一列而不给它提供值,因为它是一个(有点)复杂的对象,每次使用该表时可能不会有用。

所以我当前的代码是这样的:

            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"])之前保持"空"?

我可以做一个专栏吗';s值延迟数据绑定

我想你做不到。

我最终存储了一个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);