2012-05-14 13 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