2009-12-08 127 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; 
} 
相關問題