2

シナリオは次のとおりです。

DropDownListの選択は、受け入れ可能な値をリストするDBテーブルからバインドされます。ある時点での値は次のとおりです。

1 2 3 4

その後のある時点で、許容値のリストは次のように変更されます。

ワンツーフォーファイブ

ただし、ドロップダウンの値を格納するDBのフィールドには、一部の行に「Three」の値が含まれています。これらの行の1つをロードし、SelectedValueをそのように設定する場合:

dd.SelectedValue = data.Field; // where data.Field == "Three"

...次のエラーがスローされます:'dd'にはSelectedValueがありますが、これはアイテムのリストに存在しないため無効です。

ここでは、データのクリーンアップはオプションではありません。保存された値は、すでに作成されたデータに対しては無効な選択肢ではなく、新しく作成されたデータに対しては無効な選択肢であるため、お客様に問題が発生します。

他の人はこの状況にどのように対処しましたか?

4

6 に答える 6

6

ここでは、このような状況があります。

その場合、不足している項目を手動でドロップダウン リストに追加しますが、赤いフォントを使用します。

ユーザーがアイテムを再保存しようとすると、赤いアイテムは非アクティブで無効と見なされます。次に、ドロップダウン リストから有効な選択肢 (赤以外) を選択する必要があります。

于 2009-12-08T19:19:17.810 に答える
2

ここで実際に文字列であると仮定するとdata.Field、次のようになります。

ListItem itemToSelect = dd.Items.FindByText(data.Field);
if(itemToSelect != null)
{
     dd.SelectedItem = itemToSelect;
}
于 2009-12-08T19:14:24.760 に答える
1

true または false のいずれかである「Active」と呼ばれるドロップダウン値のデータベース テーブルに追加の列を追加できます。次に、古い値を削除する代わりに、非アクティブとしてマークするだけです。値を使用している顧客がまだいる場合にテーブルから値を削除できないように、顧客から許容値のリストへの外部キー制約を設定する必要があります。

クライアントでは、非アクティブ タイプを使用している顧客を別の色で表示できます。また、顧客をアクティブ タイプから非アクティブ タイプに変更することはできませんが、非アクティブ タイプの顧客はそのままにしておくことができる検証方法を使用できます。その設定で。

于 2009-12-08T19:13:59.910 に答える
0

また、最初にアイテムの DropDownList をチェックし、そこにない場合はリストに追加するルーチンもあります。上記のダニーと同じアイデアですが、赤で追加するという彼の追加のアイデアが気に入っています。アイデアは同じですが、私たちのルーチン全体を投稿する価値があると思いました。foreach を使用してリストを反復処理し、値の文字列を探します。Justin が上で示したように、FindByText を使用すると、より効率的になる可能性があります。

protected bool SafeSetDropDownValue(DropDownList ddl, string value, string text, bool addItemIfNotFound)
{
    // first make sure that drop down list has been data bound so that all the options are in there
    ddl.DataBind();

    // look for value in the list of dropdown values
    // (can't use try/catch because exception doesn't happen until later)
    bool found = false;
    bool selected = true;
    foreach (ListItem li in ddl.Items)
    {
        if (li.Value == value)
        {
            found = true;
        }
    }

    if (found)
    {
        ddl.SelectedValue = value;
    } 
    else 
    {
        // the value wasn't in the list,
        // so if addItem is true, then add the value to the list and then set the value 
        if (addItemIfNotFound)
        {
            ListItem li = new ListItem(text, value);
            ddl.Items.Add(li);
            ddl.SelectedValue = value;
        }
        else
        {
            // didn't find it and didn't add it
            selected = false;
        }
    }
    return selected;
}
于 2012-12-14T16:45:41.167 に答える
0

古い値 (この場合は "Three") はまだリスト テーブルに存在しますが、非アクティブ化されているだけですか、それともテーブルから完全に削除されているのでしょうか?

前者の場合は、2 つの個別のビューを設定します。1 つはアクティブなアイテムのみを含み、新しいデータ入力に使用され、もう 1 つはすべてのアイテムを含み、履歴トランザクションの表示に使用されます。

于 2009-12-08T19:15:02.373 に答える
0

そのため、「歴史的に正確だが現在は機能していない」値をドロップダウン リストに追加する必要がありますが、RequiredFieldValidatorを使用して、ユーザーがこの値をデータベースに保存できないようにすることができます。を検証したい にRequiredFieldValidator's ControlToValidate設定してから、プロパティを無効な値に設定できます。これで、save メソッドで、ページをデータベースに保存する前にbool をチェックできます。あなたのメッセージは次のようになりますDropDownListInitialValuePage.IsValidRequiredFieldValidator"This value is no longer acceptable due to ..."

お役に立てれば!

于 2009-12-08T19:16:59.233 に答える