2013-04-20 3 views
1

방금 ​​발생한 문제를 디버깅하기 위해 테스트 프로젝트를 만들었으니 여기에 무슨 일이 벌어지고 있는지 이해할 수 없습니다 ...이 테스트 프로젝트에서는 폼이 하나 있는데, TabControl 및 "DataGridView"(dgvTest)를 tabControl (2 페이지 이상)의 "background"페이지에 추가합니다. 내가 그것을에서 년대 tabPage을 선택하려고 후 (내가 그 AutoGenerateDataBoundColumns를 호출 의미) 내가 이것을 실행하는 경우 DataGridView에는 완전히 초기화 얻을 것이다, 지금사용자 지정된 열을 사용하여 DataGridView를 지연로드

private void Form1_Load(object sender, EventArgs e) 
    { 
     dgvTest.DataSource = GetDataSource(); 
     DataGridViewColumn customColumn = new DataGridViewColumn(new DataGridViewTextBoxCell()); 
     customColumn.DataPropertyName = "SampleColumn"; 
     dgvTest.Columns.Insert(dgvTest.Columns["SampleColumn"].Index, customColumn); 
     //#region Attempt #1 
     //dgvTest.Columns.Remove("SampleColumn"); 
     //customColumn.Name = "SampleColumn"; 
     //#endregion 
     #region Attempt #2 
     dgvTest.Columns["SampleColumn"].Visible = false; 
     customColumn.Name = "SampleColumnCbo"; 
     #endregion 
     dgvTest.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; 
    } 

    private DataTable GetDataSource() 
    { 
     DataTable result = new DataTable(); 
     result.Columns.Add("SampleColumn"); 
     result.Columns.Add("Q"); 
     //no rows needed 
     return result; 
    } 

: 여기 내가 문제를 재현하는 데 사용했던 코드입니다 ... 어느 시점에서 "CellType 속성이 null이므로 열을 추가 할 수 없습니다."라는 InvalidOperationException이 throw됩니다. 또는 DataGridView 컨트롤의 열 중 하나 이상에 셀 템플릿이 없습니다. "(기본적으로, 똑같은,하지만 나는 초기 상태에서 코드를 최소화하기 전에 초기 프로젝트와 테스트 프로젝트의 초기 단계에서 첫 번째 메시지 만 받았다. 이상한 점은 dgvTest가 첫 번째 tagPage에 배치되거나 직접 Form 자체에 배치되면이 Exception이 발생하지 않는다는 것입니다.

아이디어가 있으십니까? 미리 감사드립니다.

+0

참고 : 근본 원인은 같은 DataTable의 컬럼에 바인딩이 DGV 열이있는 것 같다 : 내가 주석이 'customColumn.DataPropertyName = "SampleColumn을";' 임무, 그것은 모두 괜찮아요 ... 내가 그것을 원했던 것처럼 자동으로 데이터 바인딩되지 않습니다 제외하고. : -s –

답변

2

DataGridView가 데이터 원본 (Form1_Load 코드가 호출 될 때)을 설정할 때 배경 데이터 탭에 표시되지 않는다는 사실과 관련이있는 것 같습니다. 예외가 나중에 트리거되지는 않지만. 예를 들어, DataGridView의 VisibleChanged 이벤트를 처리하고 Form1_Load 코드를 그곳으로 이동하는 경우에만 작동합니다. TabPage n을 클릭 할 때만 초기화 코드가 실행되도록합니다 (사실상 유사 초기화 됨 이벤트).

private bool dgvInitialized = false; 

private void dgvTest_VisibleChanged(object sender, EventArgs e) 
{ 
    if (dgvTest.Visible && !dgvInitialized) 
    { 
     dgvInitialized = true; 

     // Move Form1_Load code to here instead... 
    } 
} 
+0

감사합니다. 실제로이 문제가 해결됩니다. :) –