目前正在基于C#中的装饰器模式创建一个Windows窗体应用程序。该程序的结构是将一个主类(“计算机”)扩展到其他类(作为包装器),形成可用的选项。
问题:使用checkboxlist,用户可以选择在选项之间进行选择,这些选项会使每个选项特定的文本在选中时显示在一个标签中,无论是否只有一个(仅在标签文本后显示选中的选项文本) )或全部检查(所有选中的选项文本将在标签文本后一个接一个地显示)。以下代码显示标签中选中的最新选项的设置文本,如果用户取消选中所有选项,则不删除文本。
foreach (object itemChecked in checkedListBox1.CheckedItems)
{
Computer computer = (Computer)itemChecked;
label1.Text = "" + computer.description();
}
这个问题在这里解决了,但是解决方案用ToString替换了“description”。我的问题是,我希望在标签中的文本中使用“description”中的内容而不是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
}
}
一个解决方案,我认为在另一个主题上找到(不能完全记住),更接近我正在寻找的内容,下面,使用“description”作为标签的值,而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 = "";
}
P.S。我是新手/初学者程序员,请原谅任何不一致或解释不当的部分。谢谢。
答案 0 :(得分:1)
如果我很清楚你想要做什么,那么你需要创建一个返回Computer.ToString()的公共函数:
public string Description(){
return this.ToString();
}
protected override ToString(){
/// and here goes the code you need.
}