gpt4 book ai didi

c# - ComboBox On DataRepeater Control Shares Selected Index

转载 作者:行者123 更新时间:2023-11-30 16:24:42 25 4
gpt4 key购买 nike

我有一个数据转发器,每一行都使用一个组合框。当您单击“添加”按钮时,它会向 DataRepeater 添加一个新行。

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

当您单击表单上的按钮时,它会创建一个新的 LineItem,然后重新绑定(bind)。

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

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

这正确地向 DataRepeater 添加了一个新行,但现在更改组合框的索引会同时修改这两行。您需要执行一些特殊的绑定(bind)吗?

这是我的绑定(bind)代码:

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

最佳答案

经过大量搜索和整理,您可以实现这一目标!为了在 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));
}

如果您的数据在添加行上发生变化,或者您需要重新绘制转发器,则组合框索引将设置为空。因此,要修复它,在项目模板完成后,您将不得不在绘制时重置所选索引。

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

哇...好了,一切都准备就绪了。

关于c# - ComboBox On DataRepeater Control Shares Selected Index,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10585944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com