Вопрос по c# – ComboBox On DataRepeater Управляет общими ресурсами выбранного индекса

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, но теперь изменение индекса combobox изменяет обе строки. Есть ли какая-то особая привязка, которую нужно выполнить?

Вот мой обязательный код:

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

Ваш Ответ

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

Если ваши данные изменяются в строке добавления, или вам нужно перерисовать повторитель, индекс комбинированного списка будет установлен на ноль. Поэтому, чтобы исправить это, после того, как шаблон элемента будет готов, вам нужно будет сбросить выбранный индекс при рисовании.

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

Вот это да, все должно быть в порядке.

Ты только что сэкономил мне кучу времени. Отличное дополнение к универсальным знаниям Daniel
Рад помочь: D cgatian
При связывании SelectedValue ComboBox со свойством объекта Entity Framework (? Int) я получаю странное исключение InvalidOperation: «Коллекция изменена; операция перечисления может не выполняться». Причина, по которой я нахожу это странным, заключается в том, что после обработки исключения все работает нормально. Но что может вызвать это исключение? Это происходит, когда я присваиваю объект EF (то есть список объектов) источнику привязки переноса данных (RepeaterBindingSource.DataSource == EFClass;). И я просто понятия не имею, почему ... Daniel

Похожие вопросы