2012-05-14 3 views
3

각 행에 콤보 박스를 사용하는 데이터 중계기가 있습니다. 추가 단추를 클릭하면 DataRepeater에 새 행이 추가됩니다.ComboBox DataRepeater 컨트롤 공유 선택한 인덱스

public enum ColorTypes {Red, Green, Yellow} 
    class LineItem 
    { 
     public ColorTypes Color {get;set;} 
    } 

양식의 단추를 클릭하면 새 LineItem이 만들어지고 다시 바인딩됩니다.

private void btnAdd_Click(object sender, EventArgs e) 
    { 
     LineItem CopyItem = new LineItem(); 
     CurrentList= ((List<LineItem>)dataRepeater.DataSource); 

     CurrentList.Add(CopyItem); 
     dataRepeater.DataSource = CurrentList; 
    } 

이 올바르게입니다 DataRepeater에 새 행을 추가,하지만 지금은 변화 콤보 상자의 지수는 모두 행을 수정합니다. 수행해야 할 몇 가지 특수 바인딩이 있습니까?

Heres는 내 바인딩 코드 : 검색과 함께 일을 퍼팅의 LOT 후

this.cbPackage.DataSource = System.Enum.GetValues(typeof(ColorTypes)); 
this.cbPackage.DisplayMember = "Color"; 

답변

3

, 당신이 해낼 수 있습니다! DataRepeater에서 콤보 상자를 제대로 사용하려면 다음 이벤트를 추가해야합니다.

이제 ItemCloned 이벤트가 당신이 당신의 콤보 상자 컨트롤 및 수동지도 데이터 소스 (이 동일한 소스 및 공유를 사용에서 드롭 다운을 방지를 찾을 필요가 호출 될 때

this.dataForm.ItemCloned += new Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventHandler(dataForm_ItemCloned); 
this.dataForm.DrawItem += new Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventHandler(dataForm_DrawItem); 
this.cbPackage.SelectedIndexChanged += new System.EventHandler(cbColor_SelectedIndexChanged); 

MSDN ItemCloned

MSDN DrawItem 같은 선택된 인덱스)

void dataForm_ItemCloned(object sender,    Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs e) 
    { 
     var combo = (ComboBox)e.DataRepeaterItem.Controls.Find("cbColor", false)[0]; 
     //Set the data source 
     Combo.DataSource = System.Enum.GetValues(typeof(DataRepeater.ColorTypes)); 
    } 
추가 행에 데이터 변경하면

, 또는 당신이 연구를 다시 그릴 필요 epeater 콤보 상자 인덱스가 null로 설정됩니다. 따라서 항목 템플릿을 완료 한 후에는 선택한 인덱스를 다시 그려야합니다.

/// <summary> 
    /// After Item is cloned, draw item. The index is now available to select the proper data 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    void dataForm_DrawItem(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemEventArgs e) 
    { 
     var dataRepeater = (Microsoft.VisualBasic.PowerPacks.DataRepeater)sender; 
     var combo = (ComboBox)e.DataRepeaterItem.Controls.Find("cbPackage", false)[0]; 
     //Set the selected item based of the list item index 
     Combo.SelectedItem = ((List<LineItem>)DataRepeater.DataSource)[e.DataRepeaterItem.ItemIndex].PackageType; 
    } 

마지막으로 드롭 다운 값을 변경하면 마지막 문제가 발생합니다. 데이터 소스가 자동으로 업데이트되지 않습니다. 이제 콤보 박스의 인덱스를 기반으로 소스를 수동으로 업데이트해야합니다.

void cbPackage_SelectedIndexChanged(object sender, System.EventArgs e) 
    { 
     var combo = (ComboBox)sender; 
     var dataRepeaterItem = (Microsoft.VisualBasic.PowerPacks.DataRepeaterItem)combo.Parent; 
     var dataRepeater = (Microsoft.VisualBasic.PowerPacks.DataRepeater)combo.Parent.Parent; 
     var source = ((List<ColorData>)DataRepeater.DataSource)[DataRepeaterItem.ItemIndex]; 
     source.PackageType = (DropData)combo.SelectedValue;   
    } 

와우 ... 모두 다 설정해야합니다.

+0

방금 ​​저에게 많은 시간을 절약했습니다. 보편적 인 지식에 대한 큰 도움 :) – Daniel

+0

도움이 됨 : D – cgatian

+0

ComboBox의 SelectedValue를 Entity Framework 객체 속성 (? int)에 바인딩 할 때 이상한 InvalidOperation 예외가 발생합니다. "컬렉션이 수정되었으므로 열거 연산이 실행되지 않을 수 있습니다 . " 이상하게 여기는 이유는 예외가 처리 된 후에 모든 것이 잘 작동한다는 것입니다. 하지만이 예외가 발생할 수있는 이유는 무엇입니까? 그것은 datarepeater (RepeaterBindingSource.DataSource == EFClass;)의 바인딩 소스에 EF 객체 (엔티티 목록)를 할당 할 때 발생합니다. 그리고 나는 이유를 모르겠다. – Daniel

관련 문제