첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

TestProject.zip
다운로드

▶ ListItem.cs

namespace TestProject
{
    /// <summary>
    /// 리스트 항목
    /// </summary>
    public class ListItem
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 값 - Value

        /// <summary>
        /// 값
        /// </summary>
        public string Value { get; set; }

        #endregion
        #region 텍스트 - Text

        /// <summary>
        /// 텍스트
        /// </summary>
        public string Text { get; set; }

        #endregion
        #region 태그 - Tag

        /// <summary>
        /// 태그
        /// </summary>
        public object Tag { get; set; }

        #endregion
    }
}

 

728x90

 

▶ MainForm.cs

using System;
using System.Collections.ObjectModel;
using System.Text;
using System.Windows.Forms;

namespace TestProject
{
    /// <summary>
    /// 메인 폼
    /// </summary>
    public partial class MainForm : Form
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Class
        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 그리드 항목 - GridItem

        /// <summary>
        /// 그리드 항목
        /// </summary>
        private class GridItem
        {
            //////////////////////////////////////////////////////////////////////////////////////////////////// Property
            ////////////////////////////////////////////////////////////////////////////////////////// Public

            #region 제목 - Title

            /// <summary>
            /// 제목
            /// </summary>
            public string Title { get; set; }

            #endregion

            #region 타입 - Type

            /// <summary>
            /// 타입
            /// </summary>
            public string Type { get; set; }

            #endregion

            #region 값 1 - Value1

            /// <summary>
            /// 값 1
            /// </summary>
            public string Value1 { get; set; }

            #endregion

            #region 값 2 - Value2

            /// <summary>
            /// 값 2
            /// </summary>
            public string Value2 { get; set; }

            #endregion

            //////////////////////////////////////////////////////////////////////////////////////////////////// Method
            ////////////////////////////////////////////////////////////////////////////////////////// Static
            //////////////////////////////////////////////////////////////////////////////// Public

            #region 컬렉션 구하기 - GetCollection()

            /// <summary>
            /// 컬렉션 구하기
            /// </summary>
            /// <returns>컬렉션</returns>
            public static ObservableCollection<GridItem> GetCollection()
            {
                ObservableCollection<GridItem> collection = new ObservableCollection<GridItem>();

                collection.Add(new GridItem() { Title = "항목1", Type = "A"   , Value1 = "A", Value2 = ""  });
                collection.Add(new GridItem() { Title = "항목2", Type = "B"   , Value1 = "" , Value2 = "B" });
                collection.Add(new GridItem() { Title = "항목3", Type = "A"   , Value1 = "A", Value2 = ""  });
                collection.Add(new GridItem() { Title = "항목4", Type = "Both", Value1 = "A", Value2 = "B" });
                collection.Add(new GridItem() { Title = "항목5", Type = "B"   , Value1 = "" , Value2 = "B" });

                return collection;
            }

            #endregion
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - MainForm()

        /// <summary>
        /// 생성자
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            InitializeColumns();

            this.dataGridView.AllowUserToAddRows      = false;
            this.dataGridView.AllowUserToDeleteRows   = false;
            this.dataGridView.AllowUserToOrderColumns = false;
            this.dataGridView.AllowUserToResizeRows   = false;
            this.dataGridView.RowHeadersVisible       = false;

            this.dataGridView.DataSource = GridItem.GetCollection();

            this.dataGridView.CellClick             += dataGridView_CellClick;
            this.dataGridView.EditingControlShowing += dataGridView_EditingControlShowing;
            this.dataGridView.CellValueChanged      += dataGridView_CellValueChanged;
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Private
        //////////////////////////////////////////////////////////////////////////////// Event

        #region 데이터 그리드 뷰 셀 클릭시 처리하기 - dataGridView_CellClick(sender, e)

        /// <summary>
        /// 데이터 그리드 뷰 셀 클릭시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if((e.RowIndex < 0) || (e.ColumnIndex < 0))
            {
                return;
            }

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

            DataGridViewRow  dataGridViewRow  = this.dataGridView.Rows[e.RowIndex];
            DataGridViewCell dataGridViewCell = dataGridViewRow.Cells[e.ColumnIndex];

            if(dataGridViewCell is DataGridViewComboBoxCell)
            {
                dataGridView.CurrentCell = dataGridViewCell;

                dataGridView.BeginEdit(true);

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

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

        #endregion
        #region 데이터 그리드 뷰 편집 컨트롤 표시시 처리하기 - dataGridView_EditingControlShowing(sender, e)

        /// <summary>
        /// 데이터 그리드 뷰 편집 컨트롤 표시시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
            int rowIndex = this.dataGridView.CurrentCell.RowIndex;

            string y1Name = this.dataGridView.Rows[rowIndex].Cells[2].Value as string;
            string y2Name = this.dataGridView.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 && y2Name.Length > 0)
                {
                    comboBox.Items.AddRange(new object[] { "Both", "A", "B" });
                }
                else if(y1Name.Length > 0 && y2Name.Length == 0)
                {
                    comboBox.Items.AddRange(new object[] { "A", "B" });
                }
                else if(y1Name.Length == 0 && y2Name.Length > 0)
                {
                    comboBox.Items.AddRange(new object[] { "A", "B" });
                }
                else
                {
                    comboBox.Items.AddRange(new object[] { "Both", "A", "B" });
                }

                comboBox.SelectedItem = value;

                comboBox.SelectedIndexChanged += comboBox_SelectedIndexChanged;
            }
        }

        #endregion
        #region 콤보 박스 선택 인덱스 변경시 처리하기 - comboBox_SelectedIndexChanged(sender, e)

        /// <summary>
        /// 콤보 박스 선택 인덱스 변경시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                this.dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);

                this.dataGridView.UpdateCellValue(dataGridView.CurrentCell.ColumnIndex, dataGridView.CurrentCell.RowIndex);
            }
            catch(Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }
        }

        #endregion
        #region 데이터 그리드 뷰 셀 값 변경시 처리하기 - dataGridView_CellValueChanged(sender, e)

        /// <summary>
        /// 데이터 그리드 뷰 셀 값 변경시 처리하기
        /// </summary>
        /// <param name="sender">이벤트 발생자</param>
        /// <param name="e">이벤트 인자</param>
        private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("데이터 그리드 뷰 결과");
            stringBuilder.AppendLine();

            foreach(DataGridViewRow row in dataGridView.Rows)
            {
                stringBuilder.Append("행" + row.Index + "\t");

                foreach(DataGridViewCell cell in row.Cells)
                {
                    if(cell.Value == null)
                    {
                        stringBuilder.Append("null\t");
                    }
                    else
                    {
                        stringBuilder.Append(cell.Value.ToString() + "\t");
                    }
                }

                stringBuilder.AppendLine();
            }

            MessageBox.Show(stringBuilder.ToString());
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////// Function

        #region 컬럼들 초기화 하기 - InitializeColumns()

        /// <summary>
        /// 컬럼들 초기화 하기
        /// </summary>
        private void InitializeColumns()
        {
            this.dataGridView.Columns.Clear();

            DataGridViewTextBoxColumn textBoxColumn;
            
            textBoxColumn = new DataGridViewTextBoxColumn();

            textBoxColumn.Name             = "Title";
            textBoxColumn.HeaderText       = "제목";
            textBoxColumn.DataPropertyName = "Title";
            textBoxColumn.ReadOnly         = true;
            textBoxColumn.Visible          = true;

            this.dataGridView.Columns.Add(textBoxColumn);

            DataGridViewComboBoxColumn comboBoxColumn;

            comboBoxColumn = new DataGridViewComboBoxColumn();

            comboBoxColumn.Name             = "Type";
            comboBoxColumn.HeaderText       = "타입";
            comboBoxColumn.DataPropertyName = "Type";
            comboBoxColumn.ReadOnly         = false;
            comboBoxColumn.Visible          = true;

            comboBoxColumn.Items.AddRange("Both", "A", "B");

            this.dataGridView.Columns.Add(comboBoxColumn);

            textBoxColumn = new DataGridViewTextBoxColumn();

            textBoxColumn.Name             = "Value1";
            textBoxColumn.HeaderText       = "Value1";
            textBoxColumn.DataPropertyName = "Value1";
            textBoxColumn.ReadOnly         = true;
            textBoxColumn.Visible          = false;

            this.dataGridView.Columns.Add(textBoxColumn);

            textBoxColumn = new DataGridViewTextBoxColumn();

            textBoxColumn.Name             = "Value2";
            textBoxColumn.HeaderText       = "Value2";
            textBoxColumn.DataPropertyName = "Value2";
            textBoxColumn.ReadOnly         = true;
            textBoxColumn.Visible          = false;

            this.dataGridView.Columns.Add(textBoxColumn);
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요