2009-08-26 4 views
2

DataView를 ListBox에 바인딩하는 간단한 Windows Forms 응용 프로그램이 있습니다. 이 DataView는 Linq을 사용하여 특정 열을 내림차순으로 내 DataTable을 정렬합니다. 내 ListBox는 DataView에 바인딩됩니다. 그런 다음 DataTable에 데이터를 추가하는 간단한 양식이 있습니다. DataTable에 DataRow를 추가하면 ListBox에 표시됩니다..Net DataView 및 DataTable Binding

나는 ... 뒤에서 I've read 일 뭐죠에 관해서 궁금 :

DataView를 객체 필터링하거나 정렬 할 수있는 하나의 데이터 테이블의 사용자 정의보기 이다. 데이터보기는 복잡한 바인딩 컨트롤에 사용되는 데이터 "스냅 샷"입니다. 간단하게 또는 데이터보기 내의 데이터에 복잡한 바인딩을 수행 할 수 있지만 데이터 소스를 새로 고치지 않고 데이터의 고정 "그림"에 바인딩하는 것은 입니다.

DataView는 "스냅 샷"이므로 자동으로 업데이트되지 않았을 것이라고 생각했습니다. DataView는 기본 DataTable이 수정 될 때 업데이트 할 이벤트를 추가합니까? 나를 잘못하지 마라, 이것이 내가 어떻게 일하기를 바라는가?하지만 항상 그런가?

답변

2

DataView은 (는) 스냅 사진이 아닙니다. 기본 DataTable이 변경되면 자동으로 즉시 업데이트됩니다. DataTable에 추가 된 행 중 DataView의 필터 기준을 충족하는 행은 자동으로 DataView에 표시됩니다. 마찬가지로 DataTable에서 제거 된 행은 DataView에서 자동으로 사라집니다.

using System; 
using System.Linq; 
using System.Data; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("FirstName"); 

      var query = from row in dt.AsEnumerable() 
         where row.Field<string>("FirstName").StartsWith("S") 
         select row; 

      DataView view = query.AsDataView(); 

      Console.WriteLine(view.Count); // Prints 0 
      dt.Rows.Add("Sam"); 
      dt.Rows.Add("John"); 
      Console.WriteLine(view.Count); // Prints 1 
      dt.Rows.Add("Sally"); 
      dt.Rows.Add("Mary"); 
      Console.WriteLine(view.Count); // Prints 2 
      dt.Rows.RemoveAt(0); 
      Console.WriteLine(view.Count); // Prints 1 
     } 
    } 
} 

DataView를가 기본이 DataTable을 수정할 때 업데이트 할 이벤트를 추가 하는가 :

다음은 LINQ를 사용하여도 DataView의 동적 특성을 보여?

이것은 내부 구현 세부 사항이지만 이벤트를 사용하는 것이 그럴듯합니다.

DataTable의 스냅 샷을 실제로 만들려면 을 복사하려면 DataTable.Copy 메서드를 사용할 수 있습니다.