1

目前正在创建一个基于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我是一个新手/初学者程序员,请原谅任何不一致或解释不好的部分。谢谢你。

4

1 回答 1

1

如果我很好理解你想要做什么,那么你需要创建一个返回 Computer.ToString() 的公共函数:

public string Description(){
    return this.ToString();
}

protected override ToString(){
    /// and here goes the code you need.
}
于 2012-12-27T20:55:14.137 回答