3

コンボボックスを使用して各行にデータリピーターがあります。[追加] ボタンをクリックすると、新しい行が 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 に正しく追加されますが、コンボボックスのインデックスを変更すると両方の行が変更されるようになりました。実行する必要がある特別なバインドはありますか?

私のバインディングコードは次のとおりです。

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

1 に答える 1

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

行の追加でデータが変更された場合、またはリピーターを再描画する必要がある場合、コンボ ボックスのインデックスは 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;        
    }

うわー…ほら、すべてが整っているはずです。

于 2012-05-14T16:49:20.587 に答える