摘要:[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>
<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>
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
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
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的時候都跳回你的預設值