2009-05-08 2 views
1

Row를 Gridview에 바인딩하려고하는데, 이는 Category 테이블의 필드뿐만 아니라 다른 테이블의 필드도 포함합니다. 그래서 모든 필드에 대해 속성을 설정했습니다. 그러나 테이블의 열이 자주 바뀔 수 있으므로 동적으로 속성을 변경해야합니다. 나는 해시 테이블을 사용하여 다음과 같은 한 가지 방법을 발견했다. 하지만 해시 테이블 값을 gridview에 바인딩 할 수는 없습니다.C에서 동적 속성을 만들고 해시 테이블을 바인딩하십시오.

어떻게이 문제를 더 잘 해결할 수 있습니까?

public partial class Form1 : Form 
{ 
    public class Row 
    { 
     // properties 
     public Hashtable Properties = new Hashtable(); 


    } 
    public Form1() 
    { 
     InitializeComponent(); 
     DataClasses1DataContext context = new DataClasses1DataContext(); 
     var st = from c in context.Categories 
       select c; 
     var p = from pr in context.Products 
       select p; 

     Row r = new Row(); 
     //List<Row> listrow = new List<Row>(); 
     foreach (var item in st) 
     { 
      r.Properties.Add(item.Description, item.Description); 
     } 

     this.gridControl1.DataSource = r.Properties.Values; 
    } 
} 

답변

1

Hashtable.ValuesICollection -하지만 당신은 데이터 바인딩 IList이 필요합니다. 이상적으로는 유형 목록이 실제로 필요합니다. 왜 Hashtable을 여기에서 사용해야합니까? 나는 당신이 그것을 필요 충분한 행을 의심 ...

대신, 입력 목록 (List<T> 또는 BindingList<T>)를 사용하십시오. 눈금의 단일 유형에만 바인딩 할 수 있습니다. 당신이 순간에 당신은 단지 설명을 추가하고 있기 때문에, 그리드에 표시 할 것을 나에게 전혀 명확하지 않다, 그러나 가장 간단한 수준에서 :

this.gridControl1.DataSource = context.Categories.ToList(); 

또는 (더 나은) :

this.gridControl1.DataSource = context.Categories.ToBindingList(); 
당신이 하나의 그리드에 ProductsCategories 모두 넣어 도움이되지 않습니다 ...하지만, 아무것도 그들은 동일한 유형하지 않을 것이다 경우. 작품은 일반적인 속성의 익명 형식이라고 한 가지 :

var query = (from c in context.Categories 
      select new {Id = c.CategoryId, Name = c.Category, 
        Description = c.Description }).Concat(
      from p in context.Products 
      select new {Id = p.ProductId, Name = p.Product, 
        Description = p.ProductDescription }); 

this.gridControl1.DataSource = query.ToList(); 

단, 익명 형식은 불변 (비 편집 가능) 없는지 - ToBindingList() 사용에 따라서 어떤 점. 다른 옵션은 목적을 위해 자신 만의 클래스를 선언하는 것입니다. 즉 편집도 가능합니다.

관련 문제