根据先前的选择重新检查CheckedListBox

时间:2015-01-28 21:56:03

标签: c# winforms checkedlistbox

screenshot

我有一个CheckedListBox,里面装满了键值对,用户可以选择三个不同的选项。

我希望我能说清楚......

用户有三种不同的选择;我们打电话给他们"创建1","创建2"并且"创建3"。对于这些"创造"用户可以从CheckedListBox中选择项目(单击按钮时显示)(这是特定创建的相应标签)。

代码中发生的事情是:用户选择第一个"创建",并选择相应的"标签"在CheckedListBox中。此选择存储在List变量中。然后用户选择"标签"对于第二个"创建",它再次存储在(不同的)列表中。同样适用于第三次创作。

我想要和不能做的是,当再次点击第一个创建标签按钮时,出现的CheckedListBox应该检查用户在他的第一个选择中首先选择(选中)的那些项目。换句话说,如果是"创建1"标签" x"和" y"如果选中,则当用户调用CheckedListBox时,它们应重新显示为已选中。即使CheckedListBox已被用于选择标签选择的标签"创建2"同时。更糟糕的是,标签可以在两者之间添加。

所以我希望能够将CheckedListBox值与列表变量中存储的值相关联,并检查列表中出现的那些项目。

希望它不会太混乱,并且有人知道如何做到这一点。

修改 我的表格(部分)的屏幕截图。所以每个左上角"添加"按钮使底部的面板出现(包含CheckedListBox,以及其他控件)。在CheckedListbox" cbTags"选择标签,当选择"完成时,选择存储在一个变量中。单击按钮。单击"完成"按钮也会再次隐藏面板。当所有3"添加"单击按钮,并选择了相应的标签,有3个包含键值对的列表变量。问题是当其中一个"添加"再次单击按钮,checkedListBox应该再次检查这些值(存储在其中一个List变量中)。

Edit2 :您还可以在CheckedListBox右侧看到" Tags"可以添加到CheckedListBox。我不确定,还没有测试过,但我认为新的项目会被添加到列表的底部吗?这意味着列表的索引不会出现故障。

1 个答案:

答案 0 :(得分:2)

如果没有任何代码源,则更难指定要做什么,但正如Nadia在评论中建议的那样我也会建议。每当您要触发更改应在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);
  }
}

私人助手方法

/// <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循环就足够了,并且不会太费力。请注意,向字典中添加项目不会影响索引顺序,但如果您计划对选项项进行任何插入/排序/删除,则需要在Checked索引列表中补偿这些更改。

这只是一个粗略的例子。如果有优化,希望有人会编辑它们。