C# c1FlexGrid Cell에 버튼 넣기


Grid 종류를 사용한 코딩을 하다보면, Grid의 Cell 안에 Button을 넣어야 하는 경우가 종종 생깁니다.


그런데 C1 FlexGrid에는 기본적으로 제공하는 Button 기능이 없는데요. 저도 꽤나 애를 먹었습니다.


뭐, 굳이 찾아보자면 Sample 쪽에 있지만, 찾기가 제법 까다롭죠.


그래서 오늘은 C1 Flex Grid의 Cell 안에 Button 을 넣는 방법을 한 번 알아보겠습니다.


우선 아래의 코드의 하단에 아래의 Class를 추가합니다.

 

 

/// <summary>

/// HostedControl

/// helper class that contains a control hosted within a C1FlexGrid

/// </summary>

internal class HostedControl

{

internal C1FlexGrid _flex;

internal Control _ctl;

internal Row _row;

internal Column _col;

 

internal HostedControl(C1FlexGrid flex, Control hosted, int row, int col)

{

// save info

_flex = flex;

_ctl  = hosted;

_row  = flex.Rows[row];

_col  = flex.Cols[col];


// insert hosted control into grid

_flex.Controls.Add(_ctl);

}

 

internal bool UpdatePosition()

{

// get row/col indices

int r = _row.Index;

int c = _col.Index;

if (r < 0 || c < 0) return false;


// get cell rect

Rectangle rc = _flex.GetCellRect(r, c, false);


// hide control if out of range

if (rc.Width <= 0 || rc.Height <= 0 || !rc.IntersectsWith(_flex.ClientRectangle))

{

_ctl.Visible = false;

return true;

}


// move the control and show it

_ctl.Bounds = rc;

_ctl.Visible = true;


// done

return true;

}

}

 

 

그리고, 전역 변수를 하나 선언해 줍니다.

 

 

ArrayList _al = new ArrayList();

 

 

Gird에 버튼을 삽입할 위치에 아래와 같이 코딩을 합니다.

 

 

Button btn1 = new Button();

btn1.BackColor = SystemColors.Control;

btn1.Text = "Button 1";

btn1.Tag = "Button 1";


btn1.Click += Button_Click;


_al.Add(new HostedControl(_flex, btn1, 1, 1));

 

 

버튼이 눌렸을 때의 이벤트 Function 입니다.

 

 

private void Button_Click(System.Object sender, System.EventArgs e)

{

            Button bt = (Button)sender;

            MessageBox.Show("Clicked on row: " + bt.Tag);

}

 

 

같은 Class 아래의 Function을 하나 추가해 줍니다.

 

 

private void _flex_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

  foreach (HostedControl hosted in _al)

     hosted.UpdatePosition();

}

 

 

마지막으로, 해당 화면의 Designer 에서 Grid의 속성에 아래의 한 줄을 추가해 줍니다.

 

 

this._flex.Paint += new System.Windows.Forms.PaintEventHandler(this._flex_Paint);

 

 

 

 

Posted by 쭈니루
TAG

댓글을 달아 주세요

  1. CMEEUREX

    죄송하지만 전체 소스를 올리시는게 더 나을듯 합니다.
    한글 설명이 들어가 있는게 더 이해하기 힘들군여...
    좋은 정보임에는 분명하나 글쓴이가 서두에 밝힌것만큼이나
    이글을 읽는 사람 또한 난해하네여.
    여튼 잘 보고 갑니다.

    2014.09.20 22:57 [ ADDR : EDIT/ DEL : REPLY ]
  2. c# program....

    ㅁㅁㅁㅁㅁ += new System.Windows.Forms.PaintEventHandler(this._flex_Paint);
    에서 ㅁㅁㅁ를 그리드 객체 이름이라고 써주시면 좀더 보기 좋을꺼같습니다~
    좋은정보 감사합니다!

    2016.07.05 17:36 [ ADDR : EDIT/ DEL : REPLY ]