반응형

안녕하세요

 

코딩연습생입니다~

 

아직 끝나지 않은 코로나로 인해 여간 힘든게 아니네요~

 

여러분들도 모두 코로나 감염으로 부터 조심하시길 바랍니다

 

이번 포스팅은 비쥬얼스튜디오(Microsoft Visual Studio)에서 기본으로 제공되고 있는 데이터그리드뷰(DataGridView)를

 

사용할때 기본 디자인이 너무 구리죠?ㅎㅎ

 

 

갠취이긴 하지만 저는 너무 구리게 느껴집니다 그래서 약간의 설정으로 그래도 조금 있어보이는(?) 그런 그리드뷰로 

 

변경할 수 있는 설정법을 알려드릴려고 합니다

 

비쥬얼스튜디오(Microsoft Visual Studio)를 많이 사용하신분들이면 누구나 알고 계시겠지만 저는 어디까지나

 

초보(?) 아니면 연습생(?) 이런 분들을 위한 포스팅이니 이미 알고 계신분들이라면 뒤로가기를 누루시기 바랍니다ㅎㅎ

 

간혹 이런거 포스팅 하지 말아라 라고 말씀하시는 분들고 계셔서 맘이 아플때가 있어서..ㅠ

 

 

[디자인]

1. C#의 Form에 비쥬얼스튜디오(Microsoft Visual Studio)에서 기본적으로 제공하는 데이터그리드뷰(DataGridView)를 삽입합니다

 

- 삽입하는 방법은 좌측 도구상자탭에서 모든 Windows Forms 항목 중에 DataGridView 컨트롤을 마우스로 드래그앤드롭하여 사입합니다

 

 

2. 삽입된 데이터그리드뷰(DataGridView)를 마우스로 클릭하여 속성창에서 아래와 같이 수정합니다

   - AllowUserToAddRows의 속성을 False로 변경

   - AllowUserToAddRows는 기본상태에서 Rows 한줄을 보여줄것인지 하는것 입니다

   - SelectionMode를 FullRowSelect로 변경

   - 데이터그리드뷰(DataGrideView)의 내용을 선택했을때 선택 방법을 설정합니다

     (사용 용도에 따라 사용하셔도 됩니다)

   - 다음 모양 속성 변경입니다 위에서 아래로 상세 설정 화면입니다

 

   - AlternatingRowsDefaultCell 속성

   - 데이터그리드뷰(DataGrideView)의 내용 부분을 별도 설정없이 Row의 구분 색상을 표현 해줍니다

      (말로 이해가 안되시는분은 제일 마지막 완성 이미지를 보시면 이해 하실겁니다)

 

   - ColumnHeadersDefaultCell 기본 헤더 디자인 변경

   - 헤더의 기본 색생, 정렬, 크기등을 설정합니다

 

   - ★ EnableHeadersVisualStyles 값을 False로 변경

         (해당 옵션을 변경하지 않으면 디자인을 변경하셔도 화면에 표시되지 않습니다)

 

이렇게 기본 데이터그리드뷰(DataGridView) 속성을 몇개를 바꾸고 적용하면 아래와 같이

 

멋있는(?) 그리드뷰로 변경됩니다~

 

 

 

앞서 말씀드렸듯이 어디까지나 갠취입니다;;ㅎㅎ 욕하지 마세요~

반응형
반응형

안녕하세요

 

코딩연습생입니다

 

이번 포스팅은 C# WINFORM에서 데이터드리트뷰(DataGridView)를 사용하실때

 

뷰안에서 값 변경이 일어났을때 이벤트를 캣치해서 행위를 할려고 할때 해당 뷰의 내용의 셀(Cell)이 콤보 박스 일 경우

 

에는 이벤트가 먹질 않습니다

 

그래서 이런 경우 이벤트를 발생시킬수 있는 방법을 알려드리고자 합니다

 

이미 많은 분들이 알고 계실듯 한데 언제나 처럼 기록과 혹시나 모를 분들을 위해 포스팅 합니다

 

보통 데이터그리드뷰에서 값 변경 이벤트로 사용되는 이벤트 함수는 

 

CellValueChanged() 함수를 사용하는데요 다른 타입의 셀은 모두 반응하는데 이상하게 콤보박스만 반응하지 않습니다

 

 

이럴때는 다음과 같이 이벤트를 걸어주면 사용할 수 있습니다

 

첫번째 이벤트 함수는 EditingControlShowing() 함수 입니다

 

 

위와 같이 이벤트를 생성하시고 다음과 같이 콤보 박스에 아이템을 설정해 줍니다

 

private void sGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            if (sGridView1.CurrentCell.ColumnIndex == 3)
            {
                int rowIndex = this.sGridView1.CurrentCell.RowIndex;
                string y1Name = this.sGridView1.Rows[rowIndex].Cells[3].Value as string;

                ComboBox comboBox = e.Control as ComboBox;

                if (comboBox != null)
                {
                    object value = comboBox.SelectedItem;
                    comboBox.SelectedIndexChanged -= comboBox_SelectedIndexChanged;
                    comboBox.Items.Clear();

                    if (y1Name.Length > 0)
                    {
                        comboBox.Items.AddRange(new object[] { "Y", "N" });
                    }

                    comboBox.SelectedItem = value;

                    comboBox.SelectedIndexChanged += comboBox_SelectedIndexChanged;
                }
            }
        }

 

그리고 EditingControlShowing() 함수가  동작했을때 정의한 콤보박스에 SelectdIndexChanged 함수가 동작하게 합니다

 

 private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (sGridView1.CurrentCell.RowIndex >= 0)
                {
                    if (sGridView1.CurrentCell.ColumnIndex == 3)
                    {
                        if (sGridView1.Rows[sGridView1.CurrentCell.RowIndex].Cells[5].Value != null)
                        {
                            this.sGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
                            this.sGridView1.UpdateCellValue(sGridView1.CurrentCell.ColumnIndex, sGridView1.CurrentCell.RowIndex);
							
                            //이벤트 발생시 동작할 내용 부분
                        }
                    }
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }
        }

 

위의 comboBox_SelectedIndexChanged() 함수는 직접 타이핑해서 생성하였습니다

 

마지막으로 CellClick() 함수 입니다

 

 

생성된 CellClick() 함수에 아래와 같이 코딩을 합니다

        private void sGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if ((e.RowIndex < 0) || (e.ColumnIndex < 0))
            {
                return;
            }

            if (e.ColumnIndex != 0)
            {
                return;
            }

            DataGridViewRow dataGridViewRow = this.sGridView1.Rows[e.RowIndex];
            DataGridViewCell dataGridViewCell = dataGridViewRow.Cells[e.ColumnIndex];
            
            if (dataGridViewCell is DataGridViewComboBoxCell)
            {
                sGridView1.CurrentCell = dataGridViewCell;
                sGridView1.BeginEdit(true);

                DataGridViewComboBoxEditingControl comboboxEdit = (DataGridViewComboBoxEditingControl)this.sGridView1.EditingControl;

                if (comboboxEdit != null)
                {
                    comboboxEdit.DroppedDown = true;
                }
            }
        }

 

동작 순서는 이렇습니다 데이터 그리드뷰의 컨트롤에서 셀 클릭이벤트가 발생하게 되면 EditingControlShowing()를

 

호출하게 되어 콤보박스가 동작 할 수 있도록 이벤트를 활성화 해주구요

 

콤보박스가 동작한뒤에 값이 변경되는것이 감지 되어지면 comboBox_SelectedIndexChanged()가 호출되어 지는 겁니다

 

이렇게 하시면 데이터드리드뷰에서도 콤보박스의 값 변경 이벤트를 사용할수 있게 됩니다

 

디버깅 모드 상태에서 아래 그림처럼 그리드 뷰의 콤보 박스의 값을 변경하게 되면

이렇게 중단점이 걸리는 걸 보실수 있습니다

 

 

반응형

+ Recent posts