[ASP.NET] DropDownList 小技巧

摘要:[ASP.NET] DropDownList 小技巧

常常會有一些DropDownList是由資料庫傳值進去的,

有時當你要的Value是DropDownList裡面沒有的值時,往往都會彈出錯誤訊息,

我常常用一個簡單的方法就可以避免,當然不是最好的方法,但還挺簡單的,

跟之前一樣還是用個簡單的範例,在DB中建個簡單的台灣縣市的資料表,

  然後用DropDownList 搭配SqlDataSource,製作簡易的下拉

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>下拉測試</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"  
            ConnectionString="<%$ ConnectionStrings:test_conndb %>"  
            SelectCommand="SELECT [name] FROM [City]">
        </asp:SqlDataSource>
        <asp:DropDownList ID="DropDownList1" runat="server"  
            DataSourceID="SqlDataSource1" DataTextField="name" DataValueField="name">
        </asp:DropDownList>
    </div>
    </form>
</body>
</html>

如果想要有個「請選擇」之類的選項在上面的話,請修改DropDownList的控制項

<asp:DropDownList ID="DropDownList1" runat="server"  
            DataSourceID="SqlDataSource1" DataTextField="name" DataValueField="name"  
            AppendDataBoundItems="True">
            <asp:ListItem>請選擇</asp:ListItem>
        </asp:DropDownList>

 記得加上AppendDataBoundItems="True"才可以把你自定的資料和資料庫的資料結合在一起,否則只會有資料庫傳出的資料,

以上修改後就可以顯示在下拉中,

接下來我們在code behide故意選擇一個不在裡面的資料,例如台灣,就可以看到錯誤畫面囉

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            Me.DropDownList1.SelectedValue = "台灣"
        End If
    End Sub

 

 

原因就是我們要的值不在DropDownList中,解決這問題很容易,只要簡單的方法就可以解決

Protected Sub Page_PreRenderComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRenderComplete
        If Not Page.IsPostBack Then
            Try
                Me.DropDownList1.SelectedValue = "台灣"
            Catch ex As Exception
                Me.DropDownList1.SelectedIndex = 0
            End Try

        End If
    End Sub

PreRenderComplete主要是在呈現頁面內容之前所有的控制項都Ready的階段,

所以這時侯只要把值餵給DropDownList,用try去判斷,當有錯誤時就跳到第一筆,這樣就可以輕鬆解決,

建議可以在這個階段加上 If Not Page.IsPostBack Then 的判斷條件,這樣才不會在每次postback的時候都跳回你的預設值