2012-05-14 20 views
3

我有一個數據中繼器,每行使用組合框。當你點擊Add按鈕時,它會向DataRepeater添加一個新行。組合框在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添加一個新行,但現在更改combobox的索引會修改兩個行。你需要執行一些特殊的綁定嗎?

繼承人我綁定代碼:

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

回答

3

搜索,並把東西放在一起了很多之後,你可以拉這一關!爲了在DataRepeater中正確使用組合框,您需要添加以下事件。

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

現在,當ItemCloned事件被稱爲你需要找到你的組合框控件和手動地圖數據源(這可防止下拉菜單中使用相同的源和共享同樣選擇指數)

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)); 
    } 

如果附加行數據的更改,或者您需要重繪將R 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綁定到實體框架對象屬性(?int)時,我得到一個奇怪的InvalidOperation異常:「集合被修改;枚舉操作可能無法執行「。我覺得奇怪的原因是,在異常處理後,一切正常。但是什麼會導致這種異常?當我將EF對象(即實體列表)分配給datarepeater的綁定源(RepeaterBindingSource.DataSource == EFClass;)時,會發生這種情況。我根本不知道爲什麼...... – Daniel