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; }
}
}
내가 재진입 예외를 가질 때 내가 한 일은 단지 그것들을 끄는 것이었다. 그리고 모든 것이 잘 작동했다. 적어도 나의 경우에는 ... – Vale
이것을 'CellValueChanged' 이벤트에서 시도해 봤나? – V4Vendetta