Life is.

반응형

본래 VB6에서 VirtualMode라는 걸 지원했는데

실제 SQL 결과값 시간은 얼마 걸리지 않음에도 이를 Spread에 출력하는데

오랜 시간이 걸려버리는 단점을 커버하기 위한 기능이었다

 

데브피아에서 어떤 분이 올려놓았던 소스가 있으니 VB6에서 사용하실 분은

그쪽을 참조하시면 되고

 

.NET에서도 속도가 느리길래 똑같은 방법이 없나 뒤져보다 다음과 같은 답변은 발견

http://our.doctohelp.com/groups/topic/virtual-mode/

 

답변일자 보자... 2004년이다 별로 신빙성은 가지 않는다

Form_load로 되어있는걸 버튼으로 빼낸거 말고는 다 동일한 소스

 

결국 VirtualMode라는게 Row , Col 수를 미리 받아 Spread 틀만 만들어둔 다음

내용만 채워넣는 식 다른 이벤트들도 있는데... 이건 무슨 상관이려나...

 

라이브러리는 가지고 있는 파일을 넣었기에 실행시킬 땐 다른 라이브러리를 가져와서 참조하셔야 할듯

FarPoint 라이브러리만 가져오면 됩니다 

 

 

​string[, ] a = new string[100000, 20];
FarPoint.Win.Spread.Model.CellRange virtualport;

private void button1_Click(object sender, EventArgs e)
{
    int i,j;
    string s;
    fpSpread1.Sheets[0].RowCount = 100000;
    fpSpread1.Sheets[0].ColumnCount = 20;
    for (i=0;i<100000;i++)
    {
        for (j=0;j<20;j++)
        {
            s = "Row:" + i.ToString() + ", Col:" + j.ToString();
        }
    }
    virtualport = new FarPoint.Win.Spread.Model.CellRange(0,0,1000,10);
    FarPoint.Win.Spread.Model.CellRange cr = virtualport;
    FillSpread(cr);

}

private void button2_Click(object sender, EventArgs e)
{
    fpSpread1.Sheets[0].SetArray(0,0,a);
}

private void FillSpread(FarPoint.Win.Spread.Model.CellRange cr)
{
  int i,j;
  for(i=cr.Row;i<cr.Row+cr.RowCount;i++)
    for(j=cr.Column;j<cr.Column+cr.ColumnCount;j++)
      fpSpread1.Sheets[0].SetValue(i,j,a);
}

private void fpSpread1_TopChange(object sender, FarPoint.Win.Spread.TopChangeEventArgs e)
{
    if (!((virtualport.Contains(fpSpread1.GetViewportBottomRow(0), fpSpread1.GetViewportRightColumn(0), 1, 1))))
    {
        virtualport = new FarPoint.Win.Spread.Model.CellRange(fpSpread1.GetViewportTopRow(0), fpSpread1.GetViewportLeftColumn(0), 1000, 10);
        if (virtualport.IntersectRow(fpSpread1.Sheets[0].RowCount))
            virtualport = new FarPoint.Win.Spread.Model.CellRange(fpSpread1.Sheets[0].RowCount - 1000, virtualport.Column, 1000, 10);
        FillSpread(virtualport);
    }
}

private void fpSpread1_LeftChange(object sender, FarPoint.Win.Spread.LeftChangeEventArgs e)
{
    if (!((virtualport.Contains(fpSpread1.GetViewportBottomRow(0), fpSpread1.GetViewportRightColumn(0), 1, 1))))
    {
        virtualport = new FarPoint.Win.Spread.Model.CellRange(fpSpread1.GetViewportTopRow(0), fpSpread1.GetViewportLeftColumn(0), 1000, 10);
        if (virtualport.IntersectColumn(fpSpread1.Sheets[0].ColumnCount))
            virtualport = new FarPoint.Win.Spread.Model.CellRange(virtualport.Row, fpSpread1.Sheets[0].ColumnCount - 10, 1000, 10);
        FillSpread(virtualport);
    }
}


반응형

'개발 > C#' 카테고리의 다른 글

C# Excel 설치 없이 xls 파일 제어  (2) 2019.02.13
ListView 깜빡임 현상 제거  (0) 2018.09.19
단축키 구현  (0) 2018.09.11
ActiveForm 활용  (0) 2018.09.11
System.Globalization 관련 DateTimePicker  (0) 2018.09.11