首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataRepeater控件共享所选索引上的ComboBox

DataRepeater控件共享所选索引上的ComboBox
EN

Stack Overflow用户
提问于 2012-05-14 23:04:12
回答 1查看 3.2K关注 0票数 3

我有一个数据中继器,每一行使用一个组合框。当您单击Add按钮时,它会向DataRepeater中添加一个新行。

代码语言:javascript
复制
   public enum ColorTypes {Red, Green, Yellow}
   class LineItem
   {
       public ColorTypes Color {get;set;} 
   }

当您单击表单上的按钮时,它会创建一个新的LineItem,并重新绑定。

代码语言:javascript
复制
  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的索引将修改这两行。您是否需要执行一些特殊的绑定?

下面是我的绑定代码:

代码语言:javascript
复制
 this.cbPackage.DataSource = System.Enum.GetValues(typeof(ColorTypes));
 this.cbPackage.DisplayMember = "Color";
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-15 00:49:21

经过大量的搜索和拼凑,你可以做到这一点!为了在DataRepeater中正确使用组合框,您需要添加以下事件。

代码语言:javascript
复制
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事件时,您需要找到您的组合框控件并手动映射数据源(这可以防止dropdowns使用相同的源并共享相同的选定索引)

代码语言:javascript
复制
    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));
    }

如果您的数据在添加行时发生更改,或者您需要重画中继器,则组合框索引将设置为null。因此,要修复它,在项目模板完成后,您将不得不在绘制时重置选定的索引。

代码语言:javascript
复制
    /// <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;  
    }

最后,最后一个问题发生在您更改dropdown的值时。数据源不会自动更新。因此,现在您需要基于combobox的索引手动更新源代码。

代码语言:javascript
复制
 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;        
    }

哇..。好了,一切都应该准备好了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10585944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档