目前正在创建一个基于C#装饰器模式的windows窗体应用程序。该程序的结构是具有一个主类(“计算机”),其中一个主类被扩展到其他类(作为包装器),这些类形成了可用的选项。
问题:使用复选框列表,用户可以在选项之间进行选择,这使得每个选项的特定文本在被选中时出现在一个标签中,无论是只有一个(只有选中的选项文本将显示在标签文本之后)还是全部被选中(所有选中的选项文本将在标签文本之后一个接一个地显示)。以下代码显示了标签中选中的最新选项的设置文本,如果用户取消选中所有选项,它不会删除文本。
foreach (object itemChecked in checkedListBox1.CheckedItems)
{
Computer computer = (Computer)itemChecked;
label1.Text = "" + computer.description();
}
该问题已在此处解决,但解决方案将“描述”替换为 ToString。我的问题是,我希望将“描述”中保存的内容用于标签中的文本,而不是使用 ToString 中保存的内容来命名每个选中的选项。下面是它们的代码示例,它们都来自主类(计算机):
public virtual String description()
{
return "Currently in basket is a Computer ";
//return this.ToString();
}
public override string ToString()
{
return "Desktop";
}
其背后的原因是为了保持装饰器模式结构,ToString 绕过了它,因为它可以在没有装饰器模式结构的情况下以相同的方式使用。前面提到的解决方案如下:
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (e.NewValue == CheckState.Checked && e.CurrentValue == CheckState.Unchecked) //Continue if the new CheckState value of the item is changing to Checked
{
label1.Text += "a " + checkedListBox1.Items[e.Index].ToString() +", "; //Append ("a " + the item's value + ", ") to the label1 Text property
}
else if (e.NewValue == CheckState.Unchecked && e.CurrentValue == CheckState.Checked) //Continue if the new CheckState value of the item is changing to Unchecked
{
label1.Text = label1.Text.Replace("a " +checkedListBox1.Items[e.Index].ToString() + ", ", ""); //Replace ("a " + the item's value + ", ") with an empty string and assign this value to the label1 Text property
}
}
我认为在另一个主题(不记得确切)上找到了一个解决方案,更接近我在下面寻找的内容,使用“描述”作为标签的值,而 ToString 保留作为选项的值。然而,这段代码带来了一个错误,即没有“CheckedItem”的定义,也没有任何同名的扩展方法(第四行末尾):
for (int i = 0; i < checkedListBox1.Items.Count; i++)
if (checkedListBox1.GetItemChecked(i))
{
Computer computer = (Computer)checkedListBox1.CheckedItem;
label1.Text = "" + computer.description();
}
else
{
label1.Text = "";
}
PS我是一个新手/初学者程序员,请原谅任何不一致或解释不好的部分。谢谢你。