2011-03-16 5 views
0
public class Employee 
{ 
    public int ColumnName {set; get;} 
    public int RowOrder {set; get;} 
    public string TabName {set; get;} 
    public string Names {set; get;} 
} 

BindingList<Employee> workers = new BindingList<Employee>(); 
workers.Add(new Employee(1, 0, "Foo", "Bob Jones")); 
workers.Add(new Employee(2, 0, "Foo", "Jane Jones")); 
workers.Add(new Employee(3, 0, "Foo", "Jim Jones")); 
workers.Add(new Employee(1, 1, "Foo", "Joe Jones")); 
workers.Add(new Employee(3, 1, "Foo", "John Jones")); 
workers.Add(new Employee(1, 0, "Bar", "Worker Bee1")); 
workers.Add(new Employee(2, 0, "Bar", "Worker Bee2"));  

탭 스트립이있는 winform이 있습니다. 탭은 동적으로 추가 할 수 있으며 TabName 속성과 동일하게 이름이 지정됩니다. 각 탭에는 TabName 속성과 동일한 이름의 DataGridView가 포함되어 있습니다.개체 속성 값의 DataGridView 열 이름은 무엇입니까?

따라서 각 탭/gridview는 올바른 개체의 데이터 만 표시해야합니다 (foo 탭에는 그리드의 foo 사용자 만 표시됨). 열 이름을 각 개체의 ColumnName 값 (예 : 1,2,3)으로하고 이름이 나타나는 행 번호가되도록 RowOrder를 원합니다. 그래서 보일 출력을 찾고 있습니다. 다음과 같이하십시오.

1   2   3 
================================== 
Bob Jones Jane Jones Jim Jones 
Joe Jones    John Jones 

격자 좌표에 값이 없으면 공백으로 두어야합니다.

저는 winforms 프로그래밍에 비교적 익숙합니다. 검색을하면 가장 좋은 방법에 대해 궁금한 점이 많습니다. 개체 목록에 제네릭 데이터 바인딩을 설정했지만 각 속성 (ColumnName, RowOrder 등)의 이름이 지정된 열이 남았습니다.이 열거는 내 각 탭을 해결하지 못한다고 언급하지는 않습니다./DataGrid는 해당 데이터 만 표시합니다. .

linq 식은 각 DataGridView를 조합하는 좋은 방법입니까? 그렇다면 어떻게 컬럼 이름을 ColumnName의 값으로 변경하는 표현식을 만들겠습니까? RowOrder를 사용하여 빈 칸을 남기고 각 행을 올바르게 정렬 할 수 있습니까?

추가 개체 목록을 만들어 각 탭/눈금을 채우고 수동으로 정렬/스태킹을 수행하는 것이 더 좋을까요?

답변

1

먼저 데이터 구조를 재구성해야합니다. 행과 열 번호가있는 이름 목록은 도움이되지 않습니다. 탭의 측면에서 테이블에 이름이 들어있는 행을 포함하고 있다고 생각하십시오.

private void AddRow(DataTable dt, params string[] names) 
{ 
    // Expand columns as required 
    while (dt.Columns.Count < names.Length) 
    { 
     DataColumn col = dt.Columns.Add(); 
     col.ColumnName = dt.Columns.Count.ToString(); 
    } 
    // Add new row 
    DataRow row = dt.NewRow(); 
    for (int i = 0; i < names.Length; i++) 
     row[i] = names[i]; 
    dt.Rows.Add(row); 
} 
private void AddToColumn(DataTable dt, int rowIdx, int colIdx, string name) 
{ 
    while (dt.Columns.Count < colIdx) 
    { 
     DataColumn col = dt.Columns.Add(); 
     col.ColumnName = dt.Columns.Count.ToString(); 
    } 
    if (dt.Rows.Count > 0) 
    { 
     while (dt.Rows[0].ItemArray.Length < colIdx) 
      dt.Rows[0][dt.Rows[0].ItemArray.Length] = ""; 
    } 
    DataRow row; 
    if (rowIdx < dt.Rows.Count) 
    { 
     row = dt.Rows[rowIdx]; 
     row[colIdx - 1] = name; 
    } 
    else 
    { 
     row = dt.NewRow(); 
     row[colIdx - 1] = name; 
     dt.Rows.Add(row); 
    } 
} 
private void buttonStart_Click(object sender, EventArgs e) 
{ 
    Dictionary<string, DataTable> workers = new Dictionary<string, DataTable>(); 

    DataTable dt = new DataTable(); 
    AddRow(dt, "Bob Jones", "Jane Jones", "Jim Jones"); 
    AddRow(dt, "Joe Jones", "", "John Jones"); 
    workers.Add("Foo", dt); 

    AddToColumn(dt, 0, 4, "Testing"); // Use this if you have to add by column 

    dt = new DataTable(); 
    AddRow(dt, "Worker Bee1", "Worker Bee2"); 
    workers.Add("Bar", dt); 

    string tabName = "Foo"; 
    dataGridView1.DataSource = workers.FirstOrDefault(x => x.Key == tabName).Value; 
} 
+0

아이디어가 있습니다. 그러나 응용 프로그램이 작동하는 방식은 행이 아니라 행을 사용합니다. 따라서 두 번째 열이 추가되기 전에 모든 열을 알 수 있습니다. 열로 데이터 테이블 열을 작성할 수 있습니까? – Dave

+0

@Dave, 열을 추가 할 수 있도록 코드를 추가했습니다. 먼저 열을 추가하는 것이 약간 이상합니다. 그렇게 할 특별한 이유가 있습니까? 그렇지 않다면 먼저 행을 써야한다고 조언합니다. –

+0

여기 샘플은 이해가되지 않을 수도 있지만, 구축중인 애플리케이션이 데이터를 추적하는 방식은 특별한 방식으로 구성되어 있습니다. 각 열은 주어진 연설을 나타냅니다. 각 셀에는 해당 연설의 인수가 들어 있습니다. 스피치 1 및 따라서 열 1은 제 2 열이 시작되기 전에 완료된다. 아이디어는 그것이 종이에서 지금하는 방식을 모방하는 것입니다. – Dave