ComboBox On 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)dataRepeater.DataSource); CurrentList.Add(CopyItem); dataRepeater.DataSource = CurrentList; } 

这正确地向DataRepeater添加了一个新行,但现在更改combobox的索引会修改这两行。 你需要执行一些特殊的绑定吗?

inheritance我的绑定代码:

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

经过大量的搜索和整理,你可以把它拉下来! 为了在DataRepeater中正确使用combobox,您需要添加以下事件。

 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事件时,您需要找到您的combobox控件并手动映射数据源(这可以防止下拉列表使用相同的源并共享相同的选定索引)

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

如果您的数据在添加行上发生更改,或者您需要重绘转发器,则combobox索引将设置为null。 所以要修复它,在项目模板完成后,你将不得不在绘制时重置选定的索引。

  ///  /// After Item is cloned, draw item. The index is now available to select the proper data ///  ///  ///  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)DataRepeater.DataSource)[e.DataRepeaterItem.ItemIndex].PackageType; } 

最后,当您更改下拉列表的值时,会出现最后一个问题。 数据源不会自动更新。 所以现在你需要根据combobox的索引手动更新源代码。

  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)DataRepeater.DataSource)[DataRepeaterItem.ItemIndex]; source.PackageType = (DropData)combo.SelectedValue; } 

哇…你走了,一切都应该都准备好了。