2011-05-06 3 views
2

DataGridView 컨트롤의 데이터 소스를 변경하려고하면 재진입 예외에 대한 올바른 방향을 알려줄 수 있습니까? 다음은 현재 적절한 해결책을 찾을 수없는 문제의 예입니다. 이런 종류의 일을 쉽게 수행 할 수있는 Visual Foxpro 배경에서 왔습니다.셀 편집 후 DataGridView에서 데이터 소스 변경

내가 부분적으로 해결 한 유일한 방법은 데이터 소스를 업데이트하기 위해 스레드를 실행하는 것이지만 비동기이기 때문에 업데이트가 발생하지 않을 가능성이 적습니다. 작동하는 또 다른 방법은 데이터를 재정렬하기 위해 별도의 버튼 컨트롤을 사용하는 것입니다.하지만 이는 사용자가 누르는 것과 관련되어 있습니다. 훨씬 더 좋은 방법은 셀을 업데이트 한 후에 자동화하는 것입니다.

다른 소스의 데이터를 편집 할 때 데이터 소스를 변경하면 그리드가 왜 화가 나는지 이해합니다. 또한 DataGridView는 열을 정렬하도록 설정할 수 있지만 정식 버전보다 정렬 작업을 수행하기를 원합니다.

아래 코드를 실행하려면 DataGridView (dgv1로 이름 지정)를 양식에 추가하십시오. 그런 다음 예외를 발생 시키려면 9에서 9까지의 셀을 변경 한 다음 다른 셀을 클릭하거나 화살표 키를 사용하여 셀 밖으로 이동하십시오. 다른 셀을 강조 표시하기 전에 엔터를 누르면 예외가 발생하지 않으며 그리드가 재정렬되지 않습니다.

namespace dgv_test 
{ 
public partial class Form1 : Form 
{ 
    private List<dv> grid; 
    public Form1() 
    { 
     InitializeComponent(); 
     // this would be from a database 
     List<dv> data = new List<dv> 
         { 
          new dv{ desc="t1", order=1}, 
          new dv{ desc="t2", order=2}, 
          new dv{ desc="t3", order=9}, 
          new dv{ desc="t4", order=4}, 
          new dv{ desc="t5", order=5}, 
         }; 
     // in memory list 
     grid = 
      (from lu in data 
      orderby lu.order 
      select new dv 
      { 
       desc = lu.desc, 
       order = lu.order 
      }).ToList(); 

     // grid list 
     dgv1.DataSource = 
      (from g in grid 
      orderby g.order 
      select new dv 
      { 
       desc = g.desc, 
       order = g.order 
      }).ToList(); 
     // make description column readonly 
     dgv1.Columns[0].ReadOnly = true; 
    } 
    private void dgv1_CellLeave(object sender, DataGridViewCellEventArgs e) 
    { 
     // only update memory copy if order column changed 
     if (dgv1.CurrentCellAddress.X == 1 && dgv1.IsCurrentCellDirty) 
     { 
      // grid is in memory copy of grid data 
      grid.ElementAt(dgv1.CurrentCellAddress.Y).order = int.Parse(dgv1.CurrentCell.EditedFormattedValue.ToString()); 
      rgrid(); 
     } 
    } 
    // this is the function to update datagridview control 
    private void rgrid() 
    { 
     // query the in memory list from the database 
     var gx = 
      (from g in grid 
      orderby g.order 
      select new dv 
      { 
       desc = g.desc, 
       order = g.order 
      }).ToList(); 
     // set the datagridview control with the newly ordered set 
     dgv1.DataSource = gx.ToList(); 
     // do the same for the in memory list so that both are in alinement 
     grid = gx.ToList(); 
    } 
} 
class dv 
{ 
    public string desc { get; set; } 
    public int order { get; set; } 
} 
} 
+0

내가 재진입 예외를 가질 때 내가 한 일은 단지 그것들을 끄는 것이었다. 그리고 모든 것이 잘 작동했다. 적어도 나의 경우에는 ... – Vale

+1

이것을 'CellValueChanged' 이벤트에서 시도해 봤나? – V4Vendetta

답변

0

코드를 DataGridView의 CellValueChanged 이벤트로 이동하면 잘 작동합니다.