// 前台
<asp:DropDownList ID="sectionDropDownList" runat="server"></asp:DropDownList>
// 後台 Page_Load
protected void Page_Load(object sender, EventArgs e)
{
SourceDb db = new SourceDb();
sectionDropDownList.DataSource = db.DatasetDb("SELECT * FROM [Section]").Tables[0].DefaultView;
sectionDropDownList.DataTextField = "name";
sectionDropDownList.DataValueField = "code";
sectionDropDownList.DataBind(); // 每次請求都綁定!
}
// 按鈕點擊
protected void Button_Click(object sender, EventArgs e)
{
string val = sectionDropDownList.SelectedValue; // 永遠是第一項!
Response.Write(val);
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) // 關鍵:僅首次加載綁定
{
SourceDb db = new SourceDb();
sectionDropDownList.DataSource = db.DatasetDb("SELECT * FROM [Section]").Tables[0].DefaultView;
sectionDropDownList.DataTextField = "name";
sectionDropDownList.DataValueField = "code";
sectionDropDownList.DataBind();
}
}
若 DropDownList 數據依賴查詢條件(如:省份 → 城市),需在條件改變時重新綁定:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindProvinces(); // 首次綁定省份
BindCities(ddlProvince.SelectedValue); // 綁定城市
}
}
protected void ddlProvince_SelectedIndexChanged(object sender, EventArgs e)
{
BindCities(ddlProvince.SelectedValue); // 省份變化時重綁城市
// 注意:ddlProvince 需設置 AutoPostBack="true"
}
首次請求 (Get) PostBack 請求
───────────────── ─────────────────
Page_Load Page_Load
└─ DataBind() ──→ ├─ IsPostBack? Yes → 跳過 DataBind
└─ ViewState 保存 └─ ViewState 自動恢復 SelectedValue
Button_Click Button_Click
└─ 讀取 SelectedValue └─ 正確獲取用戶選擇
| 錯誤代碼 | 後果 | 修正 |
|---|---|---|
| `if (Page.IsPostBack) DataBind();` | 反向邏輯:PostBack 時才綁定,首次為空 | `if (!IsPostBack)` |
| 在 `Page_PreRender` 綁定 | ViewState 已保存,綁定覆蓋用戶選擇 | 移至 `Page_Load` 且加 `!IsPostBack` |
| 每次綁定前 `Items.Clear()` | 同 `DataBind()` 效果,清空選中狀態 | 同樣需 `!IsPostBack` 守護 |