2013-07-05 3 views
0

나는 몇 개의 열이있는 테이블을 가지고 있는데, 테이블이 사용될 때마다 유용하지 않을 수도있는 (다소) 복잡한 개체이기 때문에 먼저 값을 제공하는 열을 withouth에 추가하고 싶습니다.열의 값을 늦게 데이터 바인딩 할 수 있습니까?

그래서 내 현재 코드는 다음과 같습니다 : 그것은 DoSomethingwith(table.Rows[x]["Member"])을 사용하는 때까지

  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 숙박이 "빈"할 수 있습니까?

답변

0

나는 그럴 수 없다.

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);