1

現在、C# でデコレータ パターンに基づいて Windows フォーム アプリケーション プログラムを作成しています。プログラムは、利用可能なオプションを形成する他のクラス (ラッパーとして) に拡張された 1 つのメイン クラス (「コンピューター」) を持つように構成されています。

問題: ユーザーがオプションを選択できるチェック ボックス リストを使用して、各オプションに固有のテキストを 1 つのラベルに表示するオプションを選択します。がチェックされます (チェックされたすべてのオプション テキストは、ラベル テキストの後に次々と表示されます)。次のコードは、ラベルでチェックされた最新のオプションの設定テキストを示しており、ユーザーがすべてのオプションのチェックを外してもテキストは削除されません。

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」の定義もまったく同じ名前の拡張メソッドも存在しないというエラーをもたらします (4 行目の終わり)。

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 に答える