반응형

기본적인 Grid Control의 기능은 만들었지만 왼쪽의 특정 열들을 고정하고자 할 경우의 기능을 추가해 보기로 하겠다.

좌측 컬럼(Column)의 갯수를 지정하면 지정된 컬럼들은 움직이지 않고 고정되도록 한다.

아래의 그림 처럼 가로 스크롤바를 움직였을 때 고정컬럼 개수를 2개를 지정했을 때 컬럼 헤드 속성의 Visible이 True인 2개의 컬럼을 움직이지 않고 고정되도록 처리하는 것을 말한다.

[그림 19-1] 컬럼 고정 첫 화면
[그림 19-2] 컬럼 고정 두 번째
[그림 19-3] 컬럼 고정 세 번째

WANIGrid.cs 파일에 컬럼 고정을 관리하기 위한 변수를 선언한다.

private int colFixed = 0;   //고정 컬럼 개수

private SolidBrush colFixBrush = new SolidBrush(SystemColors.ControlLight);  //고정컬럼의 배경색

 

그리고 고정 컬럼의 개수를 외부에서 지정 및 변경할 수 있도록 Property를 작성한다.

    /// <summary>
    /// 고정 컬럼 개수
    /// </summary>
    public int ColFixed
    {
        get { return colFixed; }
        set { colFixed = value; }
    }

 

HeaderGenerator.cs 파일을 열어서 고정 컬럼이 지정되었을 때 호출되는 DrawHeaders 추상메소드를 하나 더 추가한다.

기존의 DrawHeaders 추상메소드와의 차이점은 파라미터로 int colFixed가 하나 더 추가된 것이다.

    public abstract void DrawHeaders(int colFixed, int firstVisibleCol, int lastVisibleCol, int controlWidth, Graphics graphics, Rectangle rect);

 

HeaderGenerator.cs에 GetLastFixedCol(int colFixed) 메소드를 추가한다.

고정 컬럼 갯수를 파라미터로 입력하면 입력된 헤더 정보 중 Visible 값이 true인 컬럼만 확인해서 고정 컬럼의 마지막 인덱스 값을 반환하는 메소드이다.

    /// <summary>

    /// FixedCol 수에 맞는 Header의 Index값을 리턴
    /// fixedCol 2이지만 실제 Header Column의 Visible 값이 false인 경우 제외하고 실제 Header Column의 Index를 구한다.

    /// </summary>

    protected int GetLastFixedCol(int colFixed)
    {
        int lastFixedCol = 0;
        int startIndex = 0;
        foreach (Header head in _headers)
        {
            if (startIndex == colFixed) break;
            if (head.Visible)
            {
                lastFixedCol = head.Index;
                startIndex++;
            }
        }
        return lastFixedCol;
    }

 

Grid.cs 파일의 DrawHeader 메소드에 기존의 DrawHeaders 메소드 외에 파라미터로 colFixed가 추가된 DrawHeader를 구현하면 된다.

고정 컬럼의 폭 만큼은 남겨두고 고정 컬럼 이 후의 컬럼들이 가로 스크롤바로 움직였을 경우 사용자에게 보여지도록 로직을 추가해서 만들면 된다.

좀 더 자세히 설명을 한다면

  • 고정 컬럼의 헤더를 그린다
  • 고정 컬럼 이후의 컬럼들에 대해서는 고정 컬럼 전체의 폭 이후 부터 그리도록 처리한다.

이 부분의 코드는 아래의 소스를 참고하기 바란다.

 

지금까지 작성한 코드에 많은 부분이 미진하지만 필자의 눈에 보완이 필요한 부분과 버그 부분을 조치하고자 한다. 지금 눈에 밟히는 미진함과 버그를 빨리 처리하지 않으면 뒤에 가서 쏟아 부어야 할 노력이 더 많다는 걸 알기에 생각 날때 가능한 빨리 조치하는 것이 정신건강에 좋다.

배우는 학생의 입장에서 WinForm기반의 User Control을 만들어가는 과정을 세세하게 기록해보고자 하는 바램도 있었기에 부끄럽지만 내부의 문제와 버그를 밖으로 드러내 처리한 결과를 같이 공유하고 나의 기록으로서 남기고자 한다.

 

기존에는 고정 컬럼에 대한 고려를 하지 않은 상태에서 코드를 작성하다 보니 고정 컬럼을 적용했을 때 많은 부분에서 문제가 되는 부분이 있었다.

주로 발생한 영역이 WANIGrid.Event.cs/WANIGrid.Method.cs 파일이었다.

물론 기존에도 문제가 되었지만 모르고 있다가 이번에 고정 컬럼 부분이 추가되면서 더 눈에 띄게 된 경우도 있다.

 

WANIGrid.Even.cs 파일에서는 화면을 출력하는 메소드인 WANIGrid_Paint 메소드의 DrawHeaders 메소드 호출 시에 입력 파라미터가 하나 더 추가되어 변경되었다.

    private void WANIGrid_Paint(object sender, PaintEventArgs e)
    {
        CalcVisibleRange();
        ReCalcScrollBars();
        DrawBackground(e.Graphics, rc);
        DrawHeaders(e.Graphics, rc, colFixed);
        DrawContent(e.Graphics, rc, this.ClientRectangle.Width);
        DrawActiveCell(e.Graphics);
    }

 

그리고 가로 스크롤바를 움직였을 때 호출되는 HScrollBar_Scroll 메소드의 로직의 보완되었다.

입력된 스크롤바의 값을 기반으로 firstVisibleCol과 lastVisibleCol의 값을 설정하는 부분을 보완했다. 이 부분도 첨부된 소스를 참고하자.

변경 메소드 명 변경 내용
WANIGrid_Paint(object sender, PaintEventArgs e) 화면 출력하는 분분의 DrawHeaders 메소드 호출 부분의 입력 파라미터 추가로 인해 변경
WANIGrid_MouseMove(object sender, MouseEventArgs e) Grid Header 영역에서 컬럼과 컬럼 경계에서 마우스 좌측 버튼을 누른 상태에서 이동 시에 고정 컬럼 유무에 따라 리사이즈되는 필드의 정보를 제어하기 위해서 보완
HScrollBar_Scroll(object sender, ScrollEventArgs e) 가로 스크롤바 이동 시 마지막 컬럼이 보여지면 스크롤이 더 이상 되지 않도록 보완

 

 

가장 많은 변화가 있었던 WANIGrid.Method.cs 파일에서 눈여겨 봐야 할 부분들의 메소드 명으로 표기했다.

각 메소드의 변경 내역은 첨부된 소스를 참고하기 바라며, 개략적인 변경 내용 만을 기록하겠다.

변경 메소드 명 변경 내용
GetColFromX(int X) 마우스 포인터에 해당하는 Grid Column Index를 가져오는 부분에 고정 컬럼이 있고 없고에 따라 Column Index를 반환하도록 보완 
CalcVisibleRange() 화면에 보여져야 할 영역 계산하는 부분에 고정 컬럼의 유무에 따라 처리하도록 보완
DrawBackground(Graphics g, Rectangle rc) 선택된 컬럼/행에 대한 백그라운드 색상을 입히는 부분에 고정 컬럼 유무에 따라 처리 로직을 달리하도록 보완
SelectedRowChangeBackground(Graphics g, int lastFixedCol) DrawBackground 메소드 내의 선택된 행(Row)의 Backgroud를 그리는 기능을 메소드로 분리해서 추가
SelectedColChangeBackground(Graphics g, int lastFixedCol) DrawBackground 메소드 내의 선택된 열(Column)의 Background를 그리는 기능을 메소드로 분리해서 추가
DrawHeaders(Graphics g, Rectangle rc, int colFixed) 입력 파라미터 추가 (int colFixed)
DrawContent(Graphics g, Rectangle rc, int controlWidth) WANIGrid 내용을 그리는 영역에 고정 컬럼 유무에 대한 처리를 추가 보완
GetLastFixedCol() 고정 컬럼의 마지막 Index 값을 가져온다. (신규 추가)
GetFixedColWidth() 고정 컬럼의 전체 폭을 가져온다. (신규 추가)
GetSelectedCellRect(int row, int col) 선택한 셀(Cell) 영역을 반환하는 부분에 고정 컬럼 유무에 따른 처리를 추가

생각 보다 많은 부분의 변경을 요했고, 나름 테스트를 한다고 했지만 내가 발견하지 못한 버그도 많을 것으로 예상된다.

소스를 보고 개선이 필요한 부분이나 내가 미처 확인하지 못한 버그가 있다면 알려주기 바란다.

 

지금까지의 작업은 아래의 소스를 참고하기 바란다.

WANI Grid_20190903.zip
0.43MB

반응형

+ Recent posts