DataGridTabestyle에서 사용하기 위해 목록 또는 익명 유형으로 바인딩 소스에서 적절한 매핑 이름을 어떻게 얻습니까?

StackOverflow https://stackoverflow.com/questions/420386

문제

Datagrid의 열 폭을 제어 할 수 있도록 DatagridTabestyle 객체를 만들려고합니다. 목록에 바인딩 자원 객체를 만들었습니다. 실제로 LINQ를 통해 다음과 같은 방식으로 생성 된 익명 유형 목록에 바인딩됩니다 (내가하는 일의 명확성을 위해 변수 이름이 변경됨) :

List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query;
myDataGrid.DataSource = myBindingSource;

그런 다음 DataGridTableStyle 객체를 생성하여 Datagrid에 추가합니다. 그러나 적절한 MyDatagridTabestyle.mappingName 속성을 설정할 수 없기 때문에 설정 한 테이블 스타일 속성을 적용하지 않습니다.

나는 Google을 한 시간에 약 1/2로 검색했고 다른 포럼에서 같은 질문에 대한 링크를 계속보고 있습니다 (말 그대로 같은 텍스트, 누군가가 방금 복사하고 붙여 넣은 것처럼 ... 나는 싫어합니다 ...) . 어쨌든, 그 사람이 다른 모든 사이트에서 말하는 것처럼 제안 사항 중 어느 것도 작동하지 않습니다.

그렇다면 여기에있는 사람은 내 테이블 스타일이 실제로 제대로 작동하도록하기 위해 매핑 이름 속성을 설정 해야하는 것을 알고 있습니까? 이름을 어디에서 가져갈 수 있습니까? (비어있을 수는 없습니다 ... 데이터 가능 또는 sqlceresultset 등에 묶인 BindingSource에서만 작동합니다).

LINQ를 사용하여 필요한 필드만으로 익명의 특수 버전의 객체를 만들기 위해 문제가 될 수 있다고 생각합니다. BindingSource를 목록 개체에 직접 바인딩해야합니까? 또는 DataGRID를 목록 개체에 직접 바인딩하고 바인딩 소스를 완전히 건너 뛸 수도 있습니다.

감사

PS -C#, 소형 프레임 워크 v3.5

업데이트:

아래에 내 문제를 해결 한 답변을 게시했습니다. 그것이 최선의 접근 방식이든 아니든 효과가있었습니다. 내가 가진 것과 같은 문제를 겪고 있다면 엿볼 가치가 있습니다.

도움이 되었습니까?

해결책

이 작업을 수행하는 방법을 찾았습니다. 섹션으로 나눌 게요 ...


List<myType> myList = new List<myType>(someCapacity);
.
...populate the list with query from database...
.

DataGridTableStyle myDataGridTableStyle = new DatGridtTableStyle();
DataGridTextBoxColumn colA = new DataGridTextBoxColumn();
DataGridTextBoxColumn colB = new DataGridTextBoxColumn();
DataGridTextBoxColumn colC = new DataGridTextBoxColumn();

colA.MappingName = "FieldA";
colA.HeaderText = "Field A";
colA.Width = 50; // or whatever;

colB.MappingName = "FieldB";
.
... etc. (lather, rinse, repeat for each column I want)
.

myDataGridTableStyle.GridColumnStyles.Add(colA);
myDataGridTableStyle.GridColumnStyles.Add(colB);
myDataGridTableStyle.GridColumnStyles.Add(colC);

var query = from i in myList
            select new
            {
                i.FieldA,
                i.FieldB,
                i.FieldC
            };

myBindingSource.DataSource = query.ToList(); // Thanks Marc Gravell

// wasn't sure what else to pass in here, but null worked.
myDataGridTableStyle.MappingName = myBindingSource.GetListName(null); 

myDataGrid.TableStyles.Clear(); // Recommended on MSDN in the code examples.
myDataGrid.TablesStyles.Add(myDataGridTableStyle);
myDataGrid.DataSource = myBindingSource;

따라서 기본적으로 DataGridTabestyle.mappingName은 어떤 유형의 객체를 매핑하는지 알아야합니다. 내 객체는 익명 유형 (LINQ로 생성)이므로 런타임까지 그것이 무엇인지 모르겠습니다. 익명 유형 목록을 바인딩 소스에 바인딩 한 후 BindingSource.getListName (null)을 사용하여 익명 유형의 문자열 표현을 얻을 수 있습니다.

한 가지 주목해야 할 사항. MyList ( "MyType"유형)를 바인딩 소스에 직접 바인딩하면 DataGridTabestyle.mappingName의 값으로 문자열 "MyType"을 사용할 수있었습니다.

바라건대 이것은 다른 사람들에게 유용합니다!

다른 팁

이 페이지에서 이미 답변 모음에 추가하기 위해 ....

Windows 양식과 컴팩트 한 프레임 워크 (Windows Mobile 6.5 용)를 사용하여 주먹 응용 프로그램을 개발하려는이 같은 문제에 좌절했습니다.

위의 Marc Gravell의 의견을 통해 내가 알게 된 것은 실제로 Datagrid의 속성을 검사하여 실행 시간 매핑 이름을 얻을 수 있다는 것입니다. 이렇게하면 나는 내 묶을 때 그것을 알았습니다 List<MyType> DataGrid는 DataGrid의 DataSource 속성에 직접 Datagrid는 실제로 MappingName의 DataGridTabestyle을 찾고있었습니다.

"List`1"

어떤 조합 대신 List<MyType> 또는 MyType...

그래서 ... DataGridTabestyle Collection 편집기 (디자인 시간)의 매핑 이름에 "list`1"을 넣어서 실행 시간에 모두 만들지 않고도 열 및 기타 속성을 사용자 정의 할 수있었습니다.

나는 이것이 이미 제공된 답변에 더 많은 것을 추가하기를 바랍니다. 가이드 라인을 제공해 주셔서 감사합니다.

쿼리가 반환됩니다 IEnumerable<T> 일부 T, 그러나 대부분의 구속력있는 소스 (ASP.NET 제외)는 필요합니다. IList (예 : IList<T> 구현) - 추가해보십시오 .ToList() - 즉

myBindingSource.DataSource = query.ToList();

BindingList<T> 일반적인 바인딩 시나리오 중 일부를 더 잘 지원하기 때문에 (CF 3.5에서 지원되는 경우) 더 잘 작동 할 수 있습니다. 이것을 필요로하는 경우 (그리고 가정합니다 BindingList<T> CF 3.5에 존재하면 확장 방법을 추가 할 수 있습니다.

static BindingList<T> ToBindingList<T>(this IEnumerable<T> data)
{
    return new BindingList<T>(new List<T>(data));
}

그런 다음 전화 :

myBindingSource.DataSource = query.ToBindingList();

완전성을 위해, AN에 대한 대안 IList ~이다 IListSource (또는 Type 순수한 메타 데이터 시나리오의 경우) DataSource 일반적으로 타이핑됩니다 object; 이 문제가 아니라면 컴파일러는 아마도 문제를 말할 수 있었을 것입니다 (예 : DataSource 정의되었습니다 IList).

나는이 대답을 따랐다. 그리고 MappingName은 항상 기본 클래스 이름 (예제의 myType)이라는 것을 발견했다.

따라서 컬렉션을 BindingSource를 통해 넣으면 어쨌든 문제가 해결되고 BindingSource.getListName (NULL)이 필요하지 않은 것 같습니다.

또한 BindingSource가 귀하를 위해이 작업을 수행하므로 쿼리를 tolist () 할 필요가 없습니다.

제이슨 다운 덕분에 저를 올바른 길로 보내 주셔서 감사합니다.

열 너비를 설정하기 위해 같은 문제에 직면하고있었습니다. 많은 R & D 후에, 나는 아래와 같이 코드를 변경했고 그것의 잘 작동했습니다. 암호:

DataGridTableStyle tableStyle = new DataGridTableStyle();
tableStyle.MappingName = dgCustom.DataSource.GetType().Name;

어디 dgCustom DataGrid ID가 있습니다 dgCustom.DataSource.GetType().Name 완벽하게 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top