! 제품 버전을 정확하게 입력해 주세요.
제품 버전이 정확하게 기재되어 있지 않은 경우,
최신 버전을 기준으로 안내 드리므로
더욱 빠르고 명확한 안내를 위해
제품 버전을 정확하게 입력해 주세요!

WinForms Datagrid의 각 행에 다른 콤보 상자 값을 할당하는 방법 > 블로그 & Tips

본문 바로가기

ComponentOne

블로그 & Tips

WinForms Datagrid의 각 행에 다른 콤보 상자 값을 할당하는 방법

페이지 정보

작성자 GrapeCity 작성일 2023-01-12 11:44 조회 1,308회 댓글 0건

본문

첨부파일

FlexGrid 컨트롤로 작업하는 경우 이전 셀에서 선택한 항목에 따라 계단식 효과를 위해 셀에서 드롭다운 항목을 변경해야 하는 경우가 있을 수 있습니다.

이 블로그 포스트는 다음 상황에서 동적 값 집합으로 드롭다운 열의 셀을 채우는 방법에 대해 설명합니다.


  1. 데이터 바인딩 FlexGrid에서 계단식 효과 구현

  2. 바인딩 해제 FlexGrid에서 계단식 효과 구현



데이터 바인딩 FlexGrid에서 계단식 효과 구현


바운드 모드의 FlexGrid에서 계단식 효과를 구현하도록 IList 데이터 소스의 2계층으로 바인딩하겠습니다. 아래 GIF에서 볼 수 있듯이 첫 번째 열의 각 셀에 있는 값에 따라 두 번째 열의 드롭다운에서 새로운 도의 집합을 가져옵니다.



이를 위해 먼저 Country 값 셀을 기반으로 이에 따라 주 셀에 표시할 유형 목록의 StateOptions라는 속성을 사용하여 CountryDetails라는 사용자 정의 클래스를 만들어보겠습니다.

public class CountryDetails
{
public string Country { get; set; }
public string States { get; set; }
public List StateOptions { get; set; }
public string Population { get; set; }
public string Currency { get; set; }
public CountryDetails() { }
}}


일부 기본값으로 CountryDetails 클래스의 개체 목록을 만들고 FlexGrid 컨트롤의 데이터 소스로 이 컬렉션을 설정합니다.

List<CountryDetails> setupMyBusinessObject()
      {
           List<CountryDetails> mboList = new List<CountryDetails>();
           CountryDetails mbo = new CountryDetails();
           mbo.Country = "Afghanistan";
           mbo.Currency = "Afghan afghani";
           mbo.Population = "30.55 million";
           mbo.States = "Mazar-i-Sharif";
           mbo.StateOptions = new List<string>();
           mbo.StateOptions.Add("Mazar-i-Sharif");
           mbo.StateOptions.Add("Kabul");
           mbo.StateOptions.Add("Kandahar");
           mbo.StateOptions.Add("Herat");
           mbo.StateOptions.Add("Kunduz");
           mboList.Add(mbo);
          //Please refer to the attached sample to see full data
           return (mboList);
      }
 //Assign List of CountryDetails items to the DataSource of FlexGrid
 c1FlexGrid1.DataSource = setupMyBusinessObject();


모든 행에서 채워진 CountryDetails 속성 모두를 찾아볼 수 있습니다(Country, State, Currency, Population). State 열에 드롭다운을 채우기 위해 앞서 언급했듯이 CountryDetails의 StateOptions 속성에 중점을 둡니다.


일부 기본값으로 State 열에 셀을 미리 채웠습니다. 계속해서 콤보 상자 컨트롤을 현재 State 셀의 Editor로 만들고 해당 행에 대한 StateOptions 목록을 콤보 상자의 DataSource에 바인딩하여 State 값을 변경하는 기능도 사용자에게 제공합니다.


이를 위해 셀 편집기 및 데이터 소스를 설정하도록 FlexGrid의 BeforeEdit 이벤트를 처리하고 있습니다.

private void c1FlexGrid1_BeforeEdit(object sender, RowColEventArgs e)  
{  
if (e.Col == 2)  
{  
comboBox1.DataSource = objectList[e.Row - 1].StateOptions;  
c1FlexGrid1.Cols[2].Editor = comboBox1;  
}}  


이 방법으로 각 State 행은 해당하는 국가 값과 동시 값을 표시합니다.



바인딩 해제 FlexGrid에서 계단식 효과 구현


처리 중인 그리드가 데이터 소스에 종속되지 않을 수 있지만 계속 이 계단식 효과를 원합니다. 아래 GIF는 Job 열 드롭다운 메뉴에 있는 값이 Region 열에서 선택한 항목에 조정되는 방식을 보여줍니다.


이 구현 내용을 다음 단계로 구분하겠습니다.

  • 드롭다운 데이터 생성

  • 선택한 Region을 기반으로 Job 열에 드롭다운 할당



드롭다운 데이터 생성


Region 및 Job 값을 저장하기 위한 데이터 열거를 생성합니다.

enum RegionEnum
{
North, South, East, West
}
​
enum JobEnum
{
Director, Manager, Accountant, Engineer, Sales, Clerical
}


Hashtable 및 ListDictionary를 만들어 각 지역에서 작업을 정의하여 Region 및 Job 열에 대해 각각 DataMap으로 설정합니다.

Hashtable _jobsPerRegion;
ListDictionary _mapJobs;
ListDictionary _mapRegions;
//create table to select which jobs exist in each region
_jobsPerRegion = new Hashtable();
_jobsPer
enum RegionEnum
{
North, South, East, West
}
​
enum JobEnum
{
Director, Manager, Accountant, Engineer, Sales, Clerical
}
Region.Add(RegionEnum.North, new JobEnum[] { JobEnum.Director, JobEnum.Manager, JobEnum.Accountant, JobEnum.Engineer, JobEnum.Sales, JobEnum.Clerical });
_jobsPerRegion.Add(RegionEnum.South, new JobEnum[] { JobEnum.Manager, JobEnum.Accountant, JobEnum.Sales });
_jobsPerRegion.Add(RegionEnum.East, new JobEnum[] { JobEnum.Manager, JobEnum.Engineer, JobEnum.Clerical });
_jobsPerRegion.Add(RegionEnum.West, new JobEnum[] { JobEnum.Accountant, JobEnum.Sales, JobEnum.Clerical });
​
//create DataMaps
_mapRegions = new ListDictionary();
foreach (RegionEnum region in Enum.GetValues(typeof(RegionEnum)))
_mapRegions.Add(region, Enum.GetName(typeof(RegionEnum), region));
​
_mapJobs = new ListDictionary();
foreach (JobEnum job in Enum.GetValues(typeof(JobEnum)))
_mapJobs.Add(job, Enum.GetName(typeof(JobEnum), job));
​
c1FlexGrid1.Cols[1].DataMap = _mapRegions;
c1FlexGrid1.Cols[1].Name = c1FlexGrid1.Cols[1].Caption = "Region";
c1FlexGrid1.Cols[2].DataMap = _mapJobs;
c1FlexGrid1.Cols[2].Name = c1FlexGrid1.Cols[2].Caption = "Job";



선택한 Region을 기반으로 Job 열에 드롭다운 할당


기본적으로 Job 열 셀은 편집할 수 없으며 특정 행에 대해 지역을 선택하는 경우 활성화하며 선택한 지역에 따라 값을 채우도록 FlexGrid의 SetupEditor 이벤트를 처리하고 콤보 상자를 필수 작업 값이 있는 Job 열의 Editor로 사용하겠습니다.

private void c1FlexGrid1_SetupEditor(object sender, RowColEventArgs e)
{
// before editing the job, remove items that don't apply to the current region
if (c1FlexGrid1.Cols[e.Col].Name == "Job")
{
ComboBox cb = c1FlexGrid1.Editor as ComboBox;
if (cb != null)
{
// get current region
RegionEnum region = (RegionEnum)c1FlexGrid1[e.Row, "Region"];
​
// get jobs that exist for this region
JobEnum[] jobs = (JobEnum[])_jobsPerRegion[region];
​
// populate list with jobs that apply to the current region
cb.Items.Clear();
foreach (JobEnum job in jobs)
{
cb.Items.Add(Enum.GetName(typeof(JobEnum), job));
}}}}


바인딩 및 바인딩 해제 모드에서 작업하는 동안 FlexGrid에서 계단식 효과를 구현하는 이 설명이 양쪽 모드를 모두 흥미롭게 느껴지도록 하길 바랍니다.



샘플 다운로드


이 블로그에 대한 sample 다운로드하십시오.

(첨부파일을 통해서도 다운로드가 가능합니다.)


시도해 보고 코멘트 섹션에 피드백 또는 질문을 남겨주시기 바랍니다. 즐겁게 코딩하세요!

FlexGrid에 대해 자세히 알아보십시오.





지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!

 
  • 페이스북으로 공유
  • 트위터로  공유
  • 링크 복사
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

태그1

메시어스 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@mescius.com | 전화 : 1670-0583 | 경기도 과천시 과천대로 7길 33, 디테크타워 B동 1107호 메시어스(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 ⓒ 2024 MESCIUS inc. All rights reserved.