2

这是场景:

DropDownList 中的选择是从列出可接受值的数据库表中绑定的。在某个时间点,这些值是:

一二三四

稍后,可接受值列表更改为:

一二四五

但是,数据库中存储下拉列表值的字段在某些行上仍包含“三”值。当加载其中一行并设置 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);
如果(itemToSelect != null)
{
     dd.SelectedItem = itemToSelect;
}
于 2009-12-08T19:14:24.760 回答
1

您可以在数据库表中为名为“Active”的下拉值添加一个额外的列,该列可以为真或假。然后,您无需删除旧值,而是将其标记为非活动状态。您应该有一个从客户到可接受值列表的外键约束,以确保如果仍有一些客户在使用它,您不能从表中删除一个值。

在客户端中,您可以以不同的颜色显示正在使用非活动类型的客户,并具有不允许您将客户从活动类型更改为非活动类型但允许使用非活动类型的客户保留的验证方法在那个设置上。

于 2009-12-08T19:13:59.910 回答
0

所以旧值,在本例中为“三”,仍然存在于列表中,但只是停用了,还是完全从表中删除了?

如果是前者,则设置两个单独的视图,一个仅包含活动项目并用于新数据输入,另一个包含所有项目并用于查看历史交易。

于 2009-12-08T19:15:02.373 回答
0

因此,您必须将“历史上准确但现已失效”的值添加到下拉列表中,但您可以使用RequiredFieldValidator来阻止用户将此值保存回数据库。RequiredFieldValidator's ControlToValidate设置为您希望验证的值DropDownList,然后您可以将InitialValue属性设置为无效值。Page.IsValid现在在您的保存方法中,您可以在将页面保存到数据库之前检查布尔值。您的消息RequiredFieldValidator可能类似于"This value is no longer acceptable due to ..."

希望这可以帮助!

于 2009-12-08T19:16:59.233 回答
0

我们还有一个例程首先检查项目的 DropDownList,如果不存在则将其添加到列表中。与上面提到的 Danny 相同的想法,但我喜欢他将其添加为红色的额外想法。尽管想法相同,但我认为发布我们的完整例程会很有价值。它使用 foreach 遍历列表以查找值字符串。正如上面贾斯汀所说,使用 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 回答