ComboBox在DataRepeater上控制共享所选索引 [英] ComboBox On DataRepeater Control Shares Selected Index

查看:235
本文介绍了ComboBox在DataRepeater上控制共享所选索引的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  public enum ColorTypes {Red,Green, b $ b 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;


解决方案

CAN可以把这个关闭!为了在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];
//设置数据源
Combo.DataSource = System.Enum.GetValues(typeof(DataRepeater.ColorTypes));
}

如果您的数据在添加行上更改或您需要重新绘制中继器组合框索引将设置为null。所以要解决它,在项目模板完成后,你将不得不重置所选的索引绘制。

  //< summary> 
///项目被克隆后,绘制项目。该索引现在可用于选择适当的数据
///< / 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];
//根据列表项索引设置所选项目
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;
}

哇...在那里,一切都应该设置。 p>

I have a data repeater with each row using a combobox. When you click the Add button it adds a new row to the DataRepeater.

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

When you click a button on the form it then creates a new LineItem, and rebinds.

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

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

This correctly adds a new row to the DataRepeater, but now changing combobox's index modifies both rows. Is there some special binding you need to perform?

Heres my binding code:

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

解决方案

After a LOT of searching and putting things together, you CAN pull this off! In order to properly use a combo box in a DataRepeater you will need to add the following events.

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

Now when the ItemCloned event is called you need to find your combo box control and manual map the data source (this prevents the dropdowns from using the same source and share the same selected index)

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

If your data changes on an add row, or you need to redraw the repeater the combo box index will be set to null. So to fix it, after the item template is done you're going to have to reset the selected index on draw.

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

Finally, the last issue occurs when you change the value of the dropdown. The datasource does not get updated automatically. So now you need to manually update the source based of the index of the 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<ColorData>)DataRepeater.DataSource)[DataRepeaterItem.ItemIndex];
        source.PackageType = (DropData)combo.SelectedValue;        
    }

Wow... There you go, everything should be all set.

这篇关于ComboBox在DataRepeater上控制共享所选索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆