2014-10-17 5 views
0

런타임시 DataGridview의 일부 열을 콤보 상자 열로 변경합니다. 이제 콤보 박스 항목의 기존 고유 값을 얻으려면 어떻게해야합니까? 엔티티 모델을 데이터 소스로 사용하고 있습니다. 내 코드 :C# 콤보 박스 항목에 datagridview 열의 고유 한 값 표시

dgvLoadTable.DataSource = null; 
var context = new AdminEntities(); 
var TableName = cboSelectTable.Text.ToString(); 
var rawData = context.GetType().GetProperty(TableName) 
           .GetValue(context, null); 
var truncatedData = ((IQueryable<object>)rawData).Take(0); 
var source = new BindingSource { DataSource = truncatedData }; 
dgvLoadTable.DataSource = source; 
dgvLoadTable.ReadOnly = false; 
dgvLoadTable.AllowUserToAddRows = true; 

for (int row= 0; row < dgvLoadTable.Rows.Count; row++ 
{ 
    for (int col = 0; col < dgvLoadTable.Columns.Count; col++) 
    { 
    if (col == 2 || col == 4) 
    { 
     this.dgvLoadTable[col, row] = new DataGridViewComboBoxCell(); 

     var item = dgvLoadTable.Rows.Cast<DataGridViewRow>() 
            .Where(r => r.Cells[0].Value != null) 
            .Select(r => r.Cells[col].Value) 
            .Distinct(); 
     ((DataGridViewComboBoxCell)dgvLoadTable[col,row]).Items 
                 .AddRange(item 
                   .ToArray()); 
     dgvLoadTable[col, row].ValueType = typeof(var); 
    } 
    } 
}        
dgvLoadTable.Refresh(); 

하지만이 방법이 효과가 있습니까?

답변

0
dgvLoadTable[col, row].ValueType = typeof(var); 

이것은 잘못되었습니다. 제발 남겨주거나 그것의 컬렉션이 아닌 데이터의 유형으로 만드십시오! 어떤 데이터 형식이 열 2 & 4에 있습니까?

문자열이나 정수 당신은

dgvLoadTable[col, row].ValueType = typeof(string); 

또는

dgvLoadTable[col, row].ValueType = typeof(int); 

쓸 수 그러나 :이 열 생성 된 이후 당신은 아마 데이터 유형을 제어 할 필요가 없으며, 당신은 onyl은 값 유형이 아닌 열 유형을 변경합니다.

그러나 셀을 변경 한 후에 값을 복원해야한다는 것을 알았습니다. 우리의 코드가 잘 작동하는지에 비해

for (int row= 0; row < dgvLoadTable.Rows.Count; row++) 
    { 
    for (int col = 0; col < dgvLoadTable.Columns.Count; col++) 
    { 
     if (col == 2 || col == 4) 
     { 
     var temp = dgvLoadTable[col, row].Value; 
     this.dgvLoadTable[col, row] = new DataGridViewComboBoxCell(); 
     dgvLoadTable[col, row].Value = temp; 

     var items = dgvLoadTable.Rows.Cast<DataGridViewRow>() 
        .Where(r => r.Cells[0].Value != null) 
        .Where(r => r.Cells[col].Value != null) 
        .Select(r => r.Cells[col].Value) 
        .OrderBy(r => r).Distinct(); 

     ((DataGridViewComboBoxCell) dgvLoadTable[col, row]) 
            .Items.AddRange(items.ToArray()); 


     } 
    } 
}        
dgvLoadTable.Refresh(); 

다른 당신이 item에 데이터가 제공 : 그래서 코드의 전체 조각은 다음과 같이해야한다.

열에 데이터가 있으면 모든 고유 값이 포함됩니다. 선택적 정렬 및 추가 where 절을 추가하여 null 값이 오지 않도록하십시오.

순서 순서에 유의하십시오. 먼저 값을 저장 한 다음 셀을 변경하고 값을 복원하고 마지막으로 콤보 상자 항목을 채우십시오!

+0

DataGridViewComboBoxCell 값이 유효하지 않은 예외를 throw합니다. – feather

+0

음, 어떤 데이터 형식이 열에 ?? – TaW

+0

예외가 수정되었지만 콤보 박스 항목에는 아무 것도 표시되지 않습니다. 데이터 유형이 고정되어 있지 않습니다. 열마다 다릅니다. – feather

관련 문제