0

以下に示すコードコメントで強調表示されている以下のエラーについてサポートが必要です。以下のメソッドの目的は、comboxアイテムを値で検索し、存在する場合はコンボボックスに設定することです。それ以外の場合は、コンボボックスに追加してから設定します。

private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)
    {
        bool isValueNotFound = false;

        cb.SelectedValue = valuetoSet;
        isValueNotFound = string.IsNullOrEmpty(Convert.ToString(cb.SelectedValue));

        if (isValueNotFound)
        {   
            //try to ignore case and find the item in combobox
            foreach (ComboBoxItem item in cb.Items) //1.ERROR AFTER ANY ITEM ADDED using my code
            {
                if (string.Compare(Convert.ToString(item.Content), valuetoSet, true) == 0)
                {
                    cb.SelectedValue = item.Content;
                    isValueNotFound = false;
                }
            }

            //if still not found add the item to the combobox
            if (isValueNotFound)
            {
                cb.Items.Add(valuetoSet);
                cb.SelectedValue = valuetoSet;//2.THIS IS NOT WORKING
            }
        }
    }

私が使用するサンプルコンボボックスは

<ComboBox Grid.Column="5" Grid.Row="4" Margin="10" Name="cbbox1" SelectedValuePath="Content">
        <ComboBoxItem Content="No" IsSelected="True"  />
        <ComboBoxItem Content="Yes"  />
    </ComboBox>

a)動作していない回線を修正する方法を教えてください。b)コメントに示されている行でエラーが発生します。どうすればそれを防ぐことができますか。

4

2 に答える 2

1

ここでの問題は、ComboBoxのアイテムに文字列を追加していることです。

cb.Items.Add(valuetoSet);

代わりに、新しいComboBoxItemを追加する必要があります。

cb.Items.Add(new ComboBoxItem { Content = valuetoSet }); 

それ以外の場合は、ItemsコレクションでComboBoxItemsと文字列を混在させます。これで、アイテムをComboBoxItemsとして反復処理すると、追加された文字列アイテムが検出されたときに例外が発生します。

ただし、ComboBoxItemsの代わりに文字列アイテムを使用することを検討する必要があります。これにより、コードがよりクリーンになり、 SelectedItemプロパティを使用して、選択した文字列アイテムを直接アドレス指定できSelectedValuePathますConvert.ToString(item.Content)

次のように、XAMLで最初のアイテム文字列を定義することもできます。

<ComboBox xmlns:sys="clr-namespace:System;assembly=mscorlib"
          SelectedIndex="0" ...>
    <sys:String>No</sys:String>
    <sys:String>Yes</sys:String>
</ComboBox>

これで、Novitchiが書いたように、SetComboBoxValueHelperメソッド全体が単純化されます。

private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)              
{              
    if (!cb.Items.Contains(valuetoSet))
    {
        cb.Items.Add(valuetoSet);
    }

    cb.SelectedItem = valuetoSet;              
}

編集:アイテムを反復処理する必要がある場合は、ComboBoxItemsの代わりに文字列も反復処理します。

foreach (string item in cb.Items)
{
    ...
}
于 2012-08-08T10:11:30.920 に答える
0

Clemensがすでに提案しているように、ComboBoxItemsとStringを混在させないでください。XAMLからコンボボックスComboBoxItemsに追加し、コードから文字列を追加します。簡単な解決策は、すべてのアイテムを文字列として設定することです。このためには、コードから「はい、いいえ」の項目も追加する必要があります。次に、SetComboBoxValueHelperは次のようになります。

    private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)
    {
        bool valueNotFound = !cb.Items.Contains(valuetoSet);

        if (valueNotFound)
            cb.Items.Add(valuetoSet);

        cb.SelectedItem = valuetoSet;
    }

wpfはあなたのためにComboBoxItemを作成し、あなたはそれを使用してそれを得ることができます

   cb.ItemContainerGenerator.ContainerFromItem("ItemString");
于 2012-08-08T10:51:35.223 に答える