2009-12-08 109 views
2

的列表中存在下面的情况:DropDownList中有一个的SelectedValue这是无效的,因为它没有在项目

在DropDownList中的选择是从数据库表列出了可接受值的约束。在一个时间点的值分别为:

一个 两个 三 四

在某一点后,可接受值的列表更改为:

一个 两个 四 五

但是,存储下拉列表值的字段在某些行上仍包含“三个”值。当加载这些行之一,并设置的SelectedValue这样:

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

...抛出一个错误,指出:“DD”拥有的SelectedValue,因为它不在项目列表中存在哪些无效。

数据清理不是这里的一个选项。这会给客户带来问题,因为存储值对于已经创建的数据不是无效的选择,而是对新创建的数据无效的选择。

其他人怎么处理这种情况?

回答

6

我们在这里有这种情况。

发生这种情况时,我手动将缺少的项目添加到下拉列表中,但以红色字体添加。

如果用户尝试重新保存该项目,则红色项目被视为无效并且无效。必须从下拉列表中选择一个有效的选项(非红色)。

+0

谢谢。目前为止,我最喜欢这个解决方案。其他很多答案都建议将这些业务规则移到数据库(我不喜欢)或者不会显示当前值,并且在这种情况下绝对不能接受。虽然在这种特殊情况下,我会允许重新保存,因为该值对于以前创建的数据仍然有效。只有新数据不应具有这些值。只有在旧数据上动态添加无效值才能充分解决问题。 – 2009-12-08 19:33:15

1

您可以在数据库表格中为下拉值添加一个名为“活动”的额外列,该值可以为true或false。然后,不要删除旧值,而是将其标记为不活动。您应该将客户的外键关键限制在可接受值列表中,以确保如果仍有某些客户正在使用它,则无法从表中删除值。

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

2

假设data.Field实际上是这里一个字符串,我会做:

 
ListItem itemToSelect = dd.Items.FindByText(data.Field); 
if(itemToSelect != null) 
{ 
    dd.SelectedItem = itemToSelect; 
} 
+0

我到目前为止找到的最佳解决方案 – alex 2009-12-10 19:43:06

+0

不错,+1。稍微压缩版本:'dd.SelectedIndex = dd.Items.IndexOf(dd.Items.FindByValue(value));'(另请参阅[这个答案](http://stackoverflow.com/questions/38612/)。) – Merenzo 2013-02-13 02:54:56

0

所以旧值,在这种情况下,“三”,依然出现在名单表,只是停用或者是删除从桌子上?

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

0

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

希望这有助于!

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; 
} 
相关问题