안녕하세요?
Datagridview를 통해서 100만개정도의 데이터를 출력시키는 프로그램을 작성하였습니다.
프로그램 사용하는데 있어서 큰 지장은 없지만 약간의 버벅임이 존재하여 확인해본 결과 스크롤시에 GC를 매우 여러번 호출하는 현상을 발견하였습니다.
Virtual Mode를 사용하여 Cellvalueneeded 이벤트를 통해 기존에 존재하는 배열의 인덱스를 참조하여 gridview의 셀에다가 데이터를 넣기만 하는데 GC를 왜이렇게 많이 호출하는지 궁금합니다.
(제 생각에는 매모리 할당 해제가 일어나지 않을것같거든요,.,)
제가 작성한 코드는 아래와 같습니다.
여러번 확인했는데 문제될것은 없어 보이는데.. 혹시 조금 더 효율적인 방법이 있나요?
private void Form1_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
if (e.RowIndex >= ListCF.Count)
{
return;
}
DataGridView dgv = (DataGridView)sender;
if (dgv.SelectedCells.Count == 1)
{
if (e.RowIndex == dgv.SelectedCells[0].RowIndex && e.ColumnIndex == 0)
{
dgv.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightSkyBlue;
}
else if (e.ColumnIndex == 0)
{
dgv.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
}
}
else
{
dgv.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
}
if (dgv.Name == DGV[(int)DGV_DEVICE.CF190].Name)
{
switch (e.ColumnIndex)
{
case (int)DGV_HEADER_CF190.NO:
e.Value = e.RowIndex + 1;
break;
case (int)DGV_HEADER_CF190.NAME:
if (ListCF[e.RowIndex].rawData_64 == 0xF000000000000000 || ListCF[e.RowIndex].rawData_64 == 0)
{
e.Value = "-";
}
else if (DeviceDataInfo[(int)DGV_DEVICE.CF190].ContainsKey(ListCF[e.RowIndex].instructionInt))
{
e.Value = (DeviceDataInfo[(int)DGV_DEVICE.CF190][ListCF[e.RowIndex].instructionInt].InstName);
}
else
{
e.Value = "Instruction ERR";
}
break;
case (int)DGV_HEADER_CF190.INSTRUCTION_s:
e.Value = ListCF[e.RowIndex].siSnsrInst65;
break;
case (int)DGV_HEADER_CF190.BIT13__9:
e.Value = ListCF[e.RowIndex].siSnsrBit13__9;
break;
case (int)DGV_HEADER_CF190.PARITY_s:
e.Value = ListCF[e.RowIndex].siSnsrParity;
break;
case (int)DGV_HEADER_CF190.BIT7__4:
e.Value = ListCF[e.RowIndex].siSnsrBit7__4;
break;
case (int)DGV_HEADER_CF190.DATA_IN_s:
e.Value = ListCF[e.RowIndex].siSnsrData;
break;
case (int)DGV_HEADER_CF190.TFF_s:
e.Value = ListCF[e.RowIndex].soSnsrTFF;
break;
case (int)DGV_HEADER_CF190.TST_s:
e.Value = ListCF[e.RowIndex].soSnsrTST;
break;
case (int)DGV_HEADER_CF190.EOP_s:
e.Value = ListCF[e.RowIndex].soSnsrEOP;
break;
case (int)DGV_HEADER_CF190.SID:
e.Value = ListCF[e.RowIndex].soSnsrSID;
break;
case (int)DGV_HEADER_CF190.DATA_Out_s:
e.Value = ListCF[e.RowIndex].soSnsrOutputData;
break;
case (int)DGV_HEADER_CF190.INSTRUCTION_m:
e.Value = ListCF[e.RowIndex].siMdulInstruction;
break;
case (int)DGV_HEADER_CF190.PARITY_m:
e.Value = ListCF[e.RowIndex].siMdulParity;
break;
case (int)DGV_HEADER_CF190.DATA_IN_m:
e.Value = ListCF[e.RowIndex].siMdulInputData;
break;
case (int)DGV_HEADER_CF190.TFF_m:
e.Value = ListCF[e.RowIndex].soMdulTFF;
break;
case (int)DGV_HEADER_CF190.TST_m:
e.Value = ListCF[e.RowIndex].soMdulTST;
break;
case (int)DGV_HEADER_CF190.EOP_m:
e.Value = ListCF[e.RowIndex].soMdulEOP;
break;
case (int)DGV_HEADER_CF190.BIT12__11:
e.Value = ListCF[e.RowIndex].soMdulBit12__11;
break;
case (int)DGV_HEADER_CF190.WDF:
e.Value = ListCF[e.RowIndex].soMdulWDF;
break;
case (int)DGV_HEADER_CF190.BIT9__8:
e.Value = ListCF[e.RowIndex].soMdulBit9__8;
break;
case (int)DGV_HEADER_CF190.DATA_OUT_m:
e.Value = ListCF[e.RowIndex].soMdulData;
break;
}
}
}
[최초 등록일: ]
[최종 수정일: 7/3/2017]