我有一个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。我不确定,还没有测试过,但我认为新的项目会被添加到列表的底部吗?这意味着列表的索引不会出现故障。
答案 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);
}
}
}
<强>结果强>
<强>摘要强>
一般的想法是刷新CheckedListBox.Items
每次应显示不同的内容。您可以找到使用数据绑定的方法,但CheckedListBox不会接受Dictionary
作为源。因此,foreach
循环就足够了,并且不会太费力。请注意,向字典中添加项目不会影响索引顺序,但如果您计划对选项项进行任何插入/排序/删除,则需要在Checked索引列表中补偿这些更改。
这只是一个粗略的例子。如果有优化,希望有人会编辑它们。