讓 DropDownList DataBind 不再發生錯誤:十一的部落:Xuite日誌
  • yan.kee
  • 文章分類
  • 最愛連結
  • 我的發燒文
  • 累積 | 今日
    loading......
  • 參觀人氣統計
  • BLOG玩意兒
  • 搜尋文章
  • 關鍵字
  • 最新文章
  • 最新回應
  • Re:只能在執行 Render() 的過程中調用 RegisterForEventValidation,by(11)於2008-07-03
    Re:[轉]自動清除7天以上的檔案 ,by(haoming)於2008-06-13
    Re:[kuso]尿布舞,by(11)於2008-05-18
    Re:[kuso]尿布舞,by(seth)於2008-05-18
    Re:C#中產生GUID,by(yankee)於2008-02-17
    Re:C#中產生GUID,by(jimmy)於2008-02-16
    Re:開發excel 問題討論串,by(11)於2008-02-02
    Re:Connection Strings 討論串,by(11)於2008-01-27
    Re:SQL 分頁,by(11)於2008-01-25
    Re:開發excel 問題討論串,by(11)於2008-01-16
  • 活動
  • 到台灣玩不帶走一張發票
    ===訪客來自===
    Locations of visitors to this page
  • 日誌使用資源






  • 如何使用RSS
    Powered by Xuite
    2008-04-14 11:35 讓 DropDownList DataBind 不再發生錯誤
  • ?
  • .net文章
  • 好文轉寄
  • 平均分數:0 顆星    投票人數:0
    我要評分:
    標籤 : 


    DropDownList 在執行 DataBind 動作時,若 Items 集合中不存在繫結的欄位值時會發生 Exception。不過 DropDownList 這種設計方式常會造成困擾,很多時候繫結的欄位值無法預期,而且 DropDownList 控制項在這種狀況釋出的錯誤在頁面程式碼中無法處理。

    為了解決這種情形,比較快的方式就是直接改掉 DropDownList,在控制項中處理這種無法繫結的情形才是最終的解決方案。那我們該從何處下手呢?想想通常 DropDownList 控制項做資料繫結的是什麼屬性呢?沒錯,就是 SelectedValue 屬性,那我們就從覆寫 SelectedValue 屬性下手,改寫 SelectedValue 屬性的 Set 動作;當寫入 SelectedValue 屬性時的新值不存在 Items 集合中時,就直接設定其 SelectedIndex = -1。這樣就可以很簡單決解掉 DropDownList 繫結錯誤的問題了。




        Public Class TBDropDownList
            Inherits DropDownList

            ''' <summary>
            ''' 覆寫 SelectedValue 屬性。
            ''' </summary>
            Public Overrides Property SelectedValue() As String
                Get
                    Return MyBase.SelectedValue
                End Get
                Set(ByVal value As String)
                    Dim oItem As ListItem = Me.Items.FindByValue(value)
                    If (oItem Is Nothing) Then
                        Me.SelectedIndex = -1 '當 Items 不存在時
                    Else
                        MyBase.SelectedValue = value
                    End If
                End Set
            End Property

        End Class

    =========分隔線=======

    我自己是用這種方法,見紅字部份

                ddl_City.DataSource = ds.Tables["CITY"];
                ddl_City.DataValueField = "DATA_INDEX";
                ddl_City.DataTextField = "DATA_VALUE";
                //以下兩行避免bind不到資料
                ddl_City.AppendDataBoundItems = true;
                ddl_City.Items.Add("");

                ddl_City.DataBind();

     

    ========又一條分格線======

    找到的另一種方法

    UserRoleID.SelectedIndex = UserRoleID.Items.IndexOf(UserRoleID.Items.FindByValue(dr["UserRoleID"].ToString()));

    就是如果通過FindByValue沒有找到指定項則為null,而Items.IndexOf(null)會返回-1.

     

    ListItem item = DropDownList1.Items.FindByValue("qqcrazyer");
    if(item != null)
    {
    item.Selected = true;
    }


    說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以瞭解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。

    異常詳細信息: System.ArgumentOutOfRangeException: 「UserRoleID」有一個無效 SelectedValue,因為它不在項目列表中

     

     

     

     

     

     

     

     



    yan.kee / Xuite日誌 / 回應(0) / 引用(0) / 好文轉寄
  • 回應