2014-01-08 65 views
1

我意識到這個問題的變種已被問及我已經在這裏和其他地方盡職調查了數十人,但到目前爲止我無法找到解決方案。希望我只是錯過了一些東西,而這個美好的社區中的某個人可以幫助我。我已閱讀並嘗試了Handling Null Data in Data Source Controls MSDN文章,但也沒有運氣。GridView DropDownList,處理空值

這是我的情況。我正在使用EntityDataSource和一個SQL Server數據庫(如果這很重要),並且我有一個通過外鍵引用各種子表的主表(我們稱之爲Shipments)。例如,貨運表點有一個引用卡車表的卡車列。

創建貨件時不需要卡車。如果用戶稍後編輯貨件以添加卡車,則一切正常。這是通過一個DropDownList一個GridView模板字段中完成,像這樣(對不起,我不知道該怎麼嬌滴滴格式化這個 - 我會,如果我以後可以對帖子進行編輯):

<asp:DropDownList ID="ddlTrucks" runat="server" AutoPostBack="false" AppendDataBoundItems="true" 
         DataTextField="Number" DataValueField="TruckID" DataSourceID="esrcTrucks" 
         SelectedValue='<%# Bind("TruckID") %>'> 
        <asp:ListItem Value="-1" Text="(Select)"></asp:ListItem> 
       </asp:DropDownList> 

好的,如果在貨件創建過程中沒有輸入卡車(公共),則DropDownList會很好地填充「(選擇)」作爲選定的項目。然而,如果貨件引用卡車,並且該卡車後來被刪除(可以說它已經毀壞並且不再是車隊的一部分),那麼我會遇到問題並獲得「ddlTruck有一個SelectedValue,它是無效,因爲它在項目列表中不存在。參數名稱:值「錯誤消息。

最好是,我想避免這個異常,所以根本不會發生。但是,如果我必須捕捉這個異常並「修復」DDL,以便顯示頁面並且用戶可以按照他們的方式行事,那麼有辦法嗎?我如何/在哪裏可以捕捉到這個?所以,我想我的問題是:

  • 這是數據庫設計問題?是否應該以某種我目前沒有做過的方式處理被引用的實體的刪除?
  • 有沒有一種方法可以防止發生這種異常, 就像它沒有進入卡車時一樣(DDL只顯示 「(Select)」)?
  • 如果我需要捕捉並處理這個異常,我該怎麼做或在哪裏做 ?

只是爲了澄清,它是而不是要求DDL保留已刪除卡車的數據。只需顯示「選擇」,一個空字符串或任何默認值都可以。意圖是,這不應該使頁面崩潰,並且用戶應該能夠在需要時編輯貨物的其他細節。

任何幫助將不勝感激。我已經花了幾天的時間,並沒有能夠得到任何工作!如果我能提供更多信息,或者如果我在我的文章中不清楚,請告訴我。

非常感謝!

+0

那麼貨物是否需要保留不再存在或應該更新的卡車的價值?我假設你想要加載頁面,然後用戶將用當前有效的選擇更新該DDL?它是否正確? – Dmase05

+0

GridView /頁面不需要保留以前的值。顯示一個空字符串或其他默認值將會很好,因爲這不是必填字段(在GridView或數據庫表本身中)。 – KevinC

回答

0

好的,謝天謝地繼續搜索找到了解決方案。由於我在通過GridView事件捕獲這個異常時遇到了這樣的問題,所以我創建了自己的DropDownList WebControl。然後,我忽略了PerformDataBinding事件中的。這裏的總體思路:

[ToolboxData("<{0}:MyDropDownList runat=server></{0}:MyDropDownList>")] 
public class MyDropDownList : DropDownList 
{ 

    protected override void PerformDataBinding(System.Collections.IEnumerable dataSource) 
    { 
     try 
     { 
      base.PerformDataBinding(dataSource); 
     } 
     catch (ArgumentOutOfRangeException ex) 
     { 
      // Handled the exception here 
     } 

    } 
} 

此溶液在計算器上here找到。這個網站上的社區爲我節省了一些嚴重的潰瘍。非常感謝所有的幫助。

0

不是在前端的標籤中設置SelectedValue,而是在代碼後面的Page_Load中檢查TruckID的有效性,並在那裏設置選定的值。

例如,在這裏我將檢查TruckID是否爲空。如果它有一個值,那麼我將所選值設置爲TruckID,否則,我將設置所選值爲ddlTrucks中的第一項,假設第一項是默認選項。

protected void Page_Load(Object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
     ddlTrucks.SelectedValue = TruckID != Null ? TruckID : ddlTrucks.Items[0].Value; 
} 
+0

謝謝您的建議! DropDownLists是GridView的Edit模板的一部分,因此我不認爲它會在Page_Load()中有任何價值,因爲那時控件將不存在?我一直試圖在GridView上找到一個很好的事件來做這樣的檢查,但到目前爲止事件要麼太早(RowEditing - 控件尚未填充),要麼在事件運行之前得到異常(行數據綁定)。 – KevinC