2012-11-20 1 views
0

쿼리 결과를 DevExpressGridControl으로 바인딩하고 싶습니다.DevExpress GridControl에 HQL 쿼리 결과를 바인딩하십시오.

쿼리 정의는 컴파일 타임에 예측할 수 없습니다. 사용자 정의 구성 설정에 따라 빌드됩니다.

var queryResults = GetSession().CreateQuery(PrepereHQLQuery()).List(); 
gridControl1.DataSource = queryResults; 

PrepareHQLQuery 반환 select col1, col2 from MyTable 가정 나는 이런 식으로 뭔가를 좀하고 싶습니다 대신이의

enter image description here

을 :

I have no concept how to force DataGrid to show data from array of object

합니까이의 GridView를 구성 할 수있는 방법이 존재에서 직접 데이터를 표시하는 열/Object[]?

또한 내 HQL 쿼리의 예기치 않은 특성으로 인해 DTO과 같은 중간 개체가 발생하지 않도록하고 싶습니다.

답변

1

IList 및 ITypedList 인터페이스를 구현하는 HQL 쿼리 결과를 캡슐화하는 래퍼 클래스를 만들 수 있습니다. 이 방법을 사용하면 XtraGrid의 데이터 소스로 HQL 쿼리 결과를 사용할 수 있습니다.
다음은 적응할 수있는 작은 샘플입니다.

IList<object[]> queryResult = new List<object[]>{ 
    new object[]{ "a", 11 }, 
    new object[]{ "b", 22 } 
}; 
gridControl1.DataSource = new QueryWrapper(queryResult); 
//... 
public class QueryWrapper : IList, ITypedList { 
    class ColumnDescriptor : PropertyDescriptor { 
     int index; 
     Type elementType; 
     public ColumnDescriptor(string name, int index, Type elementType) 
      : base(name, null) { 
      this.index = index; 
      this.elementType = elementType; 
     } 
     public override Type ComponentType { 
      get { return typeof(RowDescriptor); } 
     } 
     public override bool IsReadOnly { 
      get { return false; } 
     } 
     public override Type PropertyType { 
      get { return elementType; } 
     } 
     public override object GetValue(object component) { 
      return ((RowDescriptor)component).GetValue(index); 
     } 
     public override void SetValue(object component, object value) { 
      ((RowDescriptor)component).SetValue(index, value); 
     } 
     public override bool CanResetValue(object component) { return false; } 
     public override void ResetValue(object component) { } 
     public override bool ShouldSerializeValue(object component) { return false; } 
    } 
    class RowDescriptor : CustomTypeDescriptor { 
     QueryWrapper owner; 
     object[] rowObjects; 
     public RowDescriptor(QueryWrapper owner, object[] rowObjects) { 
      this.rowObjects = rowObjects; 
      this.owner = owner; 
     } 
     public object GetValue(int index) { 
      return rowObjects[index]; 
     } 
     public void SetValue(int index, object value) { 
      rowObjects[index] = value; 
     } 
     public override PropertyDescriptorCollection GetProperties(Attribute[] attributes) { 
      return owner.pdc; 
     } 
    } 
    IList<object[]> query; 
    List<RowDescriptor> list; 
    public QueryWrapper(IList<object[]> query) { 
     this.query = query; 
     list = new List<RowDescriptor>(query.Count); 
     for(int i = 0; i < query.Count; i++) 
      list.Add(new RowDescriptor(this, query[i])); 
    } 
    #region IList Members 
    int IList.Add(object value) { 
     throw new NotSupportedException(); 
    } 
    void IList.Clear() { 
     throw new NotSupportedException(); 
    } 
    bool IList.Contains(object value) { 
     return value is RowDescriptor && list.Contains((RowDescriptor)value); 
    } 
    int IList.IndexOf(object value) { 
     return (value is RowDescriptor) ? list.IndexOf((RowDescriptor)value) : -1; 
    } 
    void IList.Insert(int index, object value) { 
     throw new NotSupportedException(); 
    } 
    bool IList.IsFixedSize { 
     get { return true; } 
    } 
    bool IList.IsReadOnly { 
     get { return true; } 
    } 
    void IList.Remove(object value) { 
     throw new NotSupportedException(); 
    } 
    void IList.RemoveAt(int index) { 
     throw new NotSupportedException(); 
    } 
    object IList.this[int index] { 
     get { return list[index]; } 
     set { throw new NotSupportedException(); } 
    } 
    #endregion 
    #region ICollection Members 
    void ICollection.CopyTo(Array array, int index) { 
     if(array is RowDescriptor[]) list.CopyTo((RowDescriptor[])array, index); 
    } 
    int ICollection.Count { 
     get { return list.Count; } 
    } 
    bool ICollection.IsSynchronized { 
     get { return false; } 
    } 
    object ICollection.SyncRoot { 
     get { return this; } 
    } 
    #endregion 
    #region IEnumerable Members 
    IEnumerator IEnumerable.GetEnumerator() { 
     return list.GetEnumerator(); 
    } 
    #endregion 
    #region ITypedList Members 
    PropertyDescriptorCollection pdc; 
    PropertyDescriptorCollection ITypedList.GetItemProperties(PropertyDescriptor[] listAccessors) { 
     if(pdc == null) { 
      if(query.Count > 0) { 
       PropertyDescriptor[] pd = new PropertyDescriptor[query[0].Length]; 
       for(int i = 0; i < pd.Length; i++) 
        pd[i] = new ColumnDescriptor("Column" + i, i, query[0][i].GetType()); 
       pdc = new PropertyDescriptorCollection(pd); 
      } 
      else pdc = new PropertyDescriptorCollection(new PropertyDescriptor[] { }); 
     } 
     return pdc; 
    } 
    string ITypedList.GetListName(PropertyDescriptor[] listAccessors) { return string.Empty; } 
    #endregion 
}