0

DataGridView를 사용하여 DataGridViewComboBoxColumn을 추가하고, 값을 추가하고, 그리드 행을 반복하여 값을 설정합니다. 선택한 값은 다른 행 셀의 값입니다. 이것은 매우 느리며 모범 사례를 사용하고 있는지 확실하지 않습니다. 3000 행의 그리드의 경우 완료하는 데 2 ​​분 이상 걸립니다. 행 수를 반복하고 같은 결과를 가진 foreach 루프 (주석이 달린 코드에서)를 사용해 보았습니다. 이 작업을 수행하는 더 빠른 방법이 있습니까? 여기 내 코드는 다음과 같습니다.DataGridViewComboBox 열의 값을 매우 느리게 설정합니다.

DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn(); 
     cmb.HeaderText = "New Class"; 
     cmb.Name = "cmb"; 

     foreach (DataGridViewRow row in dgClasses.Rows) 
     { 
      if (row.Cells[0].Value != null) 
      { 
       cmb.Items.Add(row.Cells[0].Value); 
      } 
     } 

     dgProducts.Columns.Add(cmb); 

     for (int i = 0; i < dgProducts.Rows.Count; i++) 
     { 
      dgProducts.Rows[i].Cells["cmb"].Value = dgProducts.Rows[i].Cells["Class"].Value; 
     } 

     //foreach (DataGridViewRow row in dgProducts.Rows) 
     //{ 
     // row.Cells["cmb"].Value = row.Cells["Class"].Value; 
     //} 
+0

더 느린 이유에 대해 자세히 알고 있습니까? 두 개의 DGViews에 대한 데이터 소스에 대한 간단한 클래스를 사용하여 문제를 복제 할 수 없었습니다. 심지어 dgClass를 0 열의 3000 고유 문자열 값으로 채우고 dgProducts를 고유 클래스 중 하나를 참조하는 3000 개의 객체로 채 웁니다. 스톱워치를 넣은 후 게시 된 코드에 대해 단일 스레드 및 백그라운드 작업자를 테스트했으며 각각 0.4 ~ 0.5 초마다 작업을 마쳤습니다. – OhBeWise

+0

위 코드는 내 방법으로 dgProducts 격자에 콤보 상자 열을 추가하는 것입니다. dgProducts.Columns.Add (cmb) 뒤에 코드에 주석을 달면; 프로그램은 예상대로 매우 빠릅니다. 확실히 느린 가치의 설정입니다. dgClasses 그리드는 소수의 행을 가지므로 각 콤보 박스에는 많은 값이 없습니다. 20 명 이하. 이전 방법에서는 ReadXml을 통해 dgProducts 그리드를로드 한 다음 DataView에로드하여 행을 필터링합니다. 나중에 그리드 반복에 영향을 미칠 것이라고 생각하지 않습니까? – Blaze

+0

그렇게 생각하지는 않지만 코드와 구현 사이의 유일한 차이점입니다. 예 : dgClasses의 DataSource는'{ "Class1", "Class2", ..., "Class20"}''dgProducts 'DataSource가'List '인 문자열을 포함하는 속성이 하나만있는'List ' 동일한 속성과 두 번째 문자열 유형'{ "Foo1", ..., "Foo3000"}'. dgClasses를 20 개 항목으로 이동하면 단일 스레드 및 백그라운드 스레드가 평균 0.02 ~ 0.04 초로 실행됩니다. 데이터 소스와 속성의 수와 관련이 있을지도 모릅니다. 당혹 스럽네. – OhBeWise

답변

0

데이터 속성 이름을 추가하고 격자 행을 통해 루핑을 제거했습니다. 매우 빠르게로드됩니다.

private void AddClassCombobox() 
    { 
     DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn(); 
     cmb.HeaderText = "New Class"; 
     cmb.Name = "cmb"; 
     cmb.DataPropertyName = "Class"; // << Added this 

     foreach (DataGridViewRow row in dgClasses.Rows) 
     { 
      if (row.Cells[0].Value != null) 
      { 
       cmb.Items.Add(row.Cells[0].Value); 
      } 
     } 

     dgProducts.Columns.Add(cmb); 
    } 
관련 문제