2015-01-28 3 views
1

screenshotПовторная проверка CheckedListBox на основе предыдущего выбора

У меня есть CheckedListBox, наполненную парами ключ-значение, где пользователи могут выбрать теги, для трех различных вариантов.

Я надеюсь, что смогу сделать это ясно ...

Пользователь имеет три различных варианта; позволяет называть их «создать 1», «создать 2» и «создать 3». для каждого из них «создается» пользователь может выбирать элементы из CheckedListBox (который появляется одним нажатием кнопки) (которые являются соответствующими тегами этого конкретного создания).

Что происходит в коде: пользователь выбирает первый вариант «Создать» и выбирает соответствующие «теги» в CheckedListBox. Этот выбор сохраняется в переменной List. Затем пользователь выбирает «Метки» для второго «создать», который, опять же, сохраняется в (другом) списке. А также для 3-го создания.

То, что я хотел бы, и не могу сделать, - это когда кнопка 1-го создания тега снова нажата, появляющийся CheckedListBox должен иметь те элементы, которые были проверены пользователем, который сначала был выбран (отмечен) в его первом выборе. Другими словами, если для «Создать 1» отмечены теги «x» и «y», они должны появиться, как отмечено, когда пользователь вызывает CheckedListBox. Несмотря на то, что CheckedListBox использовался для выбора тегов для выбора тега «create 2» в среднем времени. Что делает его еще более сложным, так это то, что метки могут быть добавлены между ними.

Поэтому я хотел бы иметь возможность подключать значения CheckedListBox к тем, которые хранятся в переменных списка, и проверять те элементы, которые встречаются в списке (-ах).

Надеюсь, что это не слишком смущает, и у кого-то есть хорошая идея, как это сделать.

Редактировать: Скриншот (часть) моей формы. Таким образом, каждая из верхних левых кнопок «Добавить» делает панель внизу (которая содержит CheckedListBox, среди других элементов управления). В тегах CheckedListbox «cbTags» выбраны теги, и выбор сохраняется в переменной при нажатии кнопки «Готово». Нажатие кнопки «Готово» снова скрывает панель. Когда все 3 кнопки «Добавить» были нажаты, и соответствующие теги были выбраны, есть 3 переменных списка, содержащих пары ключ-значение. Проблема в том, что при повторном нажатии одной из этих кнопок «add» флажок checkedListBox должен иметь эти значения (которые хранятся в одной из переменных List), которые были проверены снова.

Edit2: Вы также можете видеть справа от CheckedListBox элементы управления, где «Теги» могут быть добавлены в CheckedListBox. Я не уверен, и еще не проверял, но я предполагаю, что новые элементы добавляются в нижнюю часть списка правильно? Значение индексов Перечня не выходит из строя.

+0

Какое приложение это приложение? WebForm, WinForm, WPF? –

+0

@NadiaChibrikova, это winform – HoneyBadger

+0

Вы имеете в виду CheckedListBox? – OhBeWise

ответ

2

Без какого-либо источника кода сложнее указать, что делать, но, как предложила Надя в комментариях, я бы также предложил. Всякий раз, когда вы собираетесь инициировать событие, которое изменяет те метки, которые должны отображаться в элементах CheckedListBox, вы должны сохранить список индексов отмеченных элементов. Каждый из ваших опций «Создать» должен иметь один из этих списков, сохраненных в какой-то момент. Затем нужно перезагрузить эти теги в состояние проверки, когда они будут вызваны для повторного отображения.

Для демонстрационных целей в следующем примере представлено простое приложение WinForms с тремя кнопками для переключения отображаемого содержимого CheckedListBox и еще одна кнопка для добавления дополнительных элементов в текущий отображаемый список.

Свойства

/// <summary> 
/// The index of which dictionary Options are being displayed in the CheckedListBox. 
/// </summary> 
public int SourceIndex { get; set; } 

/// <summary> 
/// The array which will contain 3 dictionaries filled with data. 
/// </summary> 
Dictionary<int, string>[] Options { get; set; } 

/// <summary> 
/// An array of 3 lists (corrosponding to the Options dictionaries) 
/// which will contain the indices of checked Options items. 
/// </summary> 
List<int>[] Checked { get; set; } 

Конструкторы

/// <summary> 
/// Initialize the Options and add content to each. 
/// New up the Checked lists. 
/// </summary> 
public Form1() 
{ 
    InitializeComponent(); 

    this.SourceIndex = -1; 
    this.checkedListBox1.CheckOnClick = true; 

    this.Checked = new List<int>[] 
    { 
    new List<int>(), 
    new List<int>(), 
    new List<int>(), 
    }; 

    this.Options = new Dictionary<int,string>[3]; 

    // Fruit Options 
    this.Options[0] = new Dictionary<int, string>(); 
    this.Options[0].Add(0, "Apple"); 
    this.Options[0].Add(1, "Banana"); 
    this.Options[0].Add(2, "Orange"); 
    this.Options[0].Add(3, "Grapes"); 

    // Meat Options 
    this.Options[1] = new Dictionary<int, string>(); 
    this.Options[1].Add(0, "Beef"); 
    this.Options[1].Add(1, "Chicken"); 
    this.Options[1].Add(2, "Pork"); 
    this.Options[1].Add(3, "Lamb"); 

    // Drink Options 
    this.Options[2] = new Dictionary<int, string>(); 
    this.Options[2].Add(0, "Milk"); 
    this.Options[2].Add(1, "Water"); 
    this.Options[2].Add(2, "Juice"); 
    this.Options[2].Add(3, "Soda"); 
} 

События

/// <summary> 
/// Save the displayed option's checked items then load the Fruit options to the CheckedListBox. 
/// </summary> 
/// <param name="sender">Button</param> 
/// <param name="e">EventArgs</param> 
private void FruitButton_Click(object sender, EventArgs e) 
{ 
    this.SaveCheckedStates(); 
    this.LoadOptions(0); 
} 

/// <summary> 
/// Save the displayed option's checked items then load the Meat options to the CheckedListBox. 
/// </summary> 
/// <param name="sender">Button</param> 
/// <param name="e">EventArgs</param> 
private void MeatButton_Click(object sender, EventArgs e) 
{ 
    this.SaveCheckedStates(); 
    this.LoadOptions(1); 
} 

/// <summary> 
/// Save the displayed option's checked items then load the Drink options to the CheckedListBox. 
/// </summary> 
/// <param name="sender">Button</param> 
/// <param name="e">EventArgs</param> 
private void DrinksButton_Click(object sender, EventArgs e) 
{ 
    this.SaveCheckedStates(); 
    this.LoadOptions(2); 
} 

/// <summary> 
/// Add an item to the currently displayed Option's items. 
/// </summary> 
/// <param name="sender">Button</param> 
/// <param name="e">EventArgs</param> 
private void AddButton_Click(object sender, EventArgs e) 
{ 
    if (!string.IsNullOrEmpty(this.textBox1.Text) && this.SourceIndex >= 0) 
    { 
    int index = this.Options[this.SourceIndex].Count; 
    string text = this.textBox1.Text; 
    this.Options[this.SourceIndex].Add(index, text); 

    this.SaveCheckedStates(); 
    this.LoadOptions(this.SourceIndex); 
    } 
} 

Private Helper Методы

/// <summary> 
/// Load the (indexed) Option's items into the CheckedListBox for display. 
/// Reset the Checked state for any previously checked. 
/// </summary> 
/// <param name="index">The index of which Option's items to load.</param> 
private void LoadOptions(int index) 
{ 
    this.SourceIndex = index; 
    this.checkedListBox1.Items.Clear(); 

    foreach (KeyValuePair<int, string> item in this.Options[index]) 
    { 
    this.checkedListBox1.Items.Add(item); 
    } 

    foreach (int i in this.Checked[index]) 
    { 
    this.checkedListBox1.SetItemChecked(i, true); 
    } 
} 

/// <summary> 
/// The displayed Options are about to change. 
/// Save the currently displayed Option's checked item indices. 
/// </summary> 
private void SaveCheckedStates() 
{ 
    if (this.SourceIndex >= 0) 
    { 
    this.Checked[this.SourceIndex].Clear(); 

    foreach (int i in this.checkedListBox1.CheckedIndices) 
    { 
     this.Checked[this.SourceIndex].Add(i); 
    } 
    } 
} 

Результат

Screenshot

Резюме Общая идея заключается в том, чтобы обновить CheckedListBox.Items Каждый раз, когда должно отображаться различное содержание. Вы можете найти способ использования привязки данных, но CheckedListBox не будет любезно принимать Dictionary в качестве источника. Как есть, петли foreach достаточны и не слишком облагаются налогом. Обратите внимание, что добавление элементов в словарь не будет нарушать порядок индексирования, но если вы планируете делать какие-либо вставки/сортировки/удаления элементов Option, вам нужно будет компенсировать эти изменения в списке Проверенных индексов.

Это просто грубый пример. Если есть какие-либо оптимизации, надеюсь, кто-то их отредактирует.

+0

Спасибо, я попробую это так. Вероятно, у нас не будет времени сделать это сегодня, но я вернусь к вам, когда я это сделаю. – HoneyBadger

+0

Еще раз спасибо, ваш очень хороший пример кода очень помог! Спасибо, что нашли время @ Надя Хибрикова, спасибо. – HoneyBadger

+0

@HoneyBadger Glad Я мог бы помочь. – OhBeWise

Смежные вопросы